Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

mdType frage ERLEDIGT

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
7Basic



Anmeldungsdatum: 24.10.2013
Beiträge: 9

BeitragVerfasst am: 24.10.2013, 01:44    Titel: mdType frage ERLEDIGT Antworten mit Zitat

so nun habe ich versucht das example zu verstehen (mdType) und dort tauchen die ersten probs auf

Code:
#Include Once "md/util/mdList.bi"

Type User
   Declare Constructor ()
   As string UName
End Type
Constructor User ()
   
End Constructor


Type MyClass
   Declare Constructor ()
   As Integer myVar
End Type
Constructor MyClass ()
   
End Constructor
Operator = (ByRef lhs As MyClass, ByRef rhs As MyClass) As Integer
   Return lhs.myVar = rhs.myVar
End Operator

mdListDeclare(MyClass)
Dim As mdList(MyClass) list

mdListDeclare(User)
Dim As mdList(User) list1


Dim As MyClass foo
foo.myVar = 0 : list.add(foo)
foo.myVar = 1 : list.add(foo)
foo.myVar = 2 : list.add(foo)
foo.myVar = 3 : list.add(foo)
foo.myVar = 0 : list.add(foo)
foo.myVar = 100 : list.add(foo)

Dim As User foo1
foo1.UName = "Mathias" : list1.add(foo1)




Print "Output 1:"
For i As Integer = 0 To list.size() - 1
   Print list.get(i).myVar
Next
Print

Print "Output 2:"
Dim As MyClass element
ForEach(MyClass, element In list)
   Print element.myVar
NextEach
Print

Print "Output 3:"
Dim As mdIterator(MyClass) iterator = list.iterator()
While iterator.hasNext()
   Print iterator.nex().myVar
Wend
Print

Sleep


der compiler findet genau einen fehler
dieser --> mdListDeclare(User) <--
was soll cih da nun tun?

Ausgabe:
error 20: Type mismatch, found 'Then' in 'mdListDeclare(User)'


Edit: Erledigt den operator sollte man declarieren zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 25.10.2013, 16:38    Titel: Antworten mit Zitat

Der Vollständigkeit halber:

Die mdTypes sind generisch aufgebaut, erlauben also auch eigene UDTs und nicht nur FreeBASIC Datentypen. Allerdings müssen drei Voraussetzungen bestehen:


  • Es muss ein leerer Standardkonstruktor existieren - oder keiner, da dann implizit einer von FreeBASIC erstellt wird.
  • Der Vergleichsoperator muss überladen werden - wichtig für die equals-Methode.
  • Der Cast to String Operator muss implementiert werden - wichtig für die toString-Methoden


Wenn der Vergleichsoperator wie in diesem Fall nicht überladen wurde, erzeugt das Makro hier natürlich invaliden FreeBASIC Code. Der error 20 ist hier ausschlaggebend.

PS: Wenn man mal nicht weiterkommt, kann man auch mit -pp compilieren und sich ansehen, zu was das Makro ausgebaut wird. Dann ist das Debuggen gleich deutlich einfacher.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
7Basic



Anmeldungsdatum: 24.10.2013
Beiträge: 9

BeitragVerfasst am: 27.11.2013, 04:50    Titel: Antworten mit Zitat

gibt es eine andere variante eine "liste" zu generieren?

falls ja welche genau? gibt es dazu examples?

so kenne ich es z.b.

Type TPerson
Field Name$
Field Alter%
end type

global PersonListe:Tlist=new Tlist

newP:Tperson=new TPerson
newP.Name="HalloUser"
newP.Alter = 6
PersonListe.addlast newP

for P:Tperson=eachin personliste
print p.name
next

wenn man nun was ändern möchte würde es so gehen

for P:Tperson=eachin personliste
if p.name="HalloUser" then
p.name="TestUser"
p.alter = 4
endif
next

wenn man etwas aus der liste entfernen mag
for P:Tperson=eachin personliste
if p.name="HalloUser" then
personliste.remove p
endif
next

ich suche den einfachsten weg. vieleicht nennt sich es anders in fb als "liste" ich wüsste aber nicht wie ich es bezeichnen soll. einfach ein unendliches array happy grinsen wo man felder drin ablegen kann happy oder eine erweiterbare type - liste - ...

Edit
um das ganze zu verdeutlichen sowas habe ich vor:
Code:
If mousedown=1 Then
      ForEach(TWindow, Element In WindowList)
         If mx>Element.x And mx<Element.x+Element.w and my>Element.y And my<Element.y+Element.H Then
            If Element.aktiv =1 Then
               If Element.move=0 Then
                                 
                  Element.move = 1 '<--------- dieses element soll nun den wert 1 in move enthalten. aber das bekomm ich nur hin wenn ich ein neues element hinzufüge und das alte kille ist sehr unpraktisch! wie geht es nun besser oder anders,?

               Else
                  End
               EndIf
            Else


ich glaube zu wissen das es in freebasic pointer heisst, jedenfalls das was ich meine oder was ich benötige.

nun die frage wie erstell ich so einen und wie durchlaufe ich ein pointer, wie verändere ich gewisse sachen so wie ich es im bsp oben beschrieben habe. ich bedanke mich im vorraus.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 27.11.2013, 07:37    Titel: Antworten mit Zitat

Es gibt in FreeBASIC keine eingebauten Listen, hier liegt ja das Problem. Pointer haben mit Listen nicht zwangsläufig was zu tun, sie werden aber verwendet, um Linked Lists zu erstellen. Auch mdTypes verwenden intern Pointer. Allerdings ist ein Pointer nur eine Adresse im Speicher.

Dein Problem ist, dass du eine Kopie des eigentlichen Elements veränderst, diese Veränderung aber nicht zurückschreibst.

In diesem Fall würde ich dir folgendes Vorschlagen:
Code:

If mousedown=1 Then
      For i As Integer = 0 To WindowList.size() - 1
         Dim As TWindow Element = WindowList.get(i)
         If mx>Element.x And mx<Element.x+Element.w and my>Element.y And my<Element.y+Element.H Then
            If Element.aktiv =1 Then
               If Element.move=0 Then
                                 
                  Element.move = 1
                  Dim As TWindow tempE = WindowList.set(i, Element) 'geändertes Element an Index-Position schreiben und altes Element zwischenspeichern

               Else
                  End
               EndIf
            Else


PS: Für neue Fragen sollte man normalerweise einen neuen Thread aufmachen.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
7Basic



Anmeldungsdatum: 24.10.2013
Beiträge: 9

BeitragVerfasst am: 27.11.2013, 15:19    Titel: Antworten mit Zitat

Code:
Dim As TWindow tempE = WindowList.set(i, Element) 'geändertes Element an Index-Position schreiben und altes Element zwischenspeichern


geändertes element wie gebe ich es den an?
tempE.move=1
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 27.11.2013, 15:56    Titel: Antworten mit Zitat

Code:
WindowList.set(i, Element)

In diesem Funktionsaufruf ist 'Element' das neue Element, das du speichern willst, und 'i' die Position, an der das Element gespeichert werden soll. Vor dem '=' steht die Variable, in die der alte Wert hineingespeichert wird (den kannst du dann normalerweise verwerfen).

Also
Code:
Element = WindowList.get(i)
Element.move = 1
DIM AS TWindow tempE = WindowList.set(i, Element)

(so wie aber auch MOD schon geschrieben hat)
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
7Basic



Anmeldungsdatum: 24.10.2013
Beiträge: 9

BeitragVerfasst am: 27.11.2013, 18:47    Titel: Antworten mit Zitat

ah er überschreibt das entsprechende aus der liste was auf I position ist?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
nemored



Anmeldungsdatum: 22.02.2007
Beiträge: 4594
Wohnort: ~/

BeitragVerfasst am: 27.11.2013, 21:48    Titel: Antworten mit Zitat

Genau.
_________________
Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz