Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
7Basic
Anmeldungsdatum: 24.10.2013 Beiträge: 9
|
Verfasst am: 24.10.2013, 02:44 Titel: mdType frage ERLEDIGT |
|
|
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 |
|
Nach oben |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 25.10.2013, 17:38 Titel: |
|
|
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 |
|
|
7Basic
Anmeldungsdatum: 24.10.2013 Beiträge: 9
|
Verfasst am: 27.11.2013, 05:50 Titel: |
|
|
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 wo man felder drin ablegen kann 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 |
|
|
MOD Fleißiger Referenzredakteur
Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 27.11.2013, 08:37 Titel: |
|
|
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 |
|
|
7Basic
Anmeldungsdatum: 24.10.2013 Beiträge: 9
|
Verfasst am: 27.11.2013, 16:19 Titel: |
|
|
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 |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 27.11.2013, 16:56 Titel: |
|
|
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 |
|
|
7Basic
Anmeldungsdatum: 24.10.2013 Beiträge: 9
|
Verfasst am: 27.11.2013, 19:47 Titel: |
|
|
ah er überschreibt das entsprechende aus der liste was auf I position ist? |
|
Nach oben |
|
|
nemored
Anmeldungsdatum: 22.02.2007 Beiträge: 4597 Wohnort: ~/
|
Verfasst am: 27.11.2013, 22:48 Titel: |
|
|
Genau. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
|
|