Hallo Leute,
habe da ein kleines Zeigerproblem,
ich versuche einen Zeiger auf eine Strukture1 in einer anderen Struktur2 zu speichern, wie kann ich nun ueber Struktur2 auf den Inhalt von Struktur1 zugreifen?
Beispiel:
Structure Struct1
a.l
EndStructure
Structure Struct2
S1.l
EndStructure
NewList Structure2.Struct2()
NewList Structure1.Struct1()
AddElement(Structure1())
a = 10
Procedure.l Add(*Struct.Struct1)
AddElement(Structure2())
Structure2()\S1 = *Struct
ProcedureReturn @Structure2()
EndProcedure
Procedure Access(*Struct.Struct2)
; wie kann ich nun auf a von Structure1 zugreifen???
; und weshalb kann ich in der Definition von Struct2
; nicht *S1.Struct1 schreiben???
EndProcedure
im vorraus schon herzlichen dank!
Zeiger auf Strukturen in Strukturen
Pointer (*pointer) werden leider nicht richtig in Structuren unterstützt, bzw. sind fehlerhaft
Denkansatz (und Lösung?)
Denkansatz (und Lösung?)
Code: Alles auswählen
*S1.struct1=*Struct\s1
debug *s1\a
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Das Problem ist, dass ich nicht an die Werte ran komme, wenn ich folgendes mache:
Add(@Structure1())
Debug Structure2()\S1
Debug @Structure1()
so ergeben beide Debugausgaben die gleiche Adresse, also ist die Adresse von Struktur1 in der Struktur2 gespeichert, aber ich komme nicht an den Inhalt von Struktur1 heran, also 'a'.
Das muss doch irgendwie gehen!?
Add(@Structure1())
Debug Structure2()\S1
Debug @Structure1()
so ergeben beide Debugausgaben die gleiche Adresse, also ist die Adresse von Struktur1 in der Struktur2 gespeichert, aber ich komme nicht an den Inhalt von Struktur1 heran, also 'a'.
Das muss doch irgendwie gehen!?
Code: Alles auswählen
Structure Struct1
a.l
EndStructure
Structure Struct2
S1.l
s2.l
EndStructure
NewList Structure2.Struct2()
NewList Structure1.Struct1()
Procedure.l Add(*Struct.Struct1)
AddElement(Structure2())
Structure2()\S1 = *Struct
ProcedureReturn @Structure2()
EndProcedure
Procedure Access(*Struct.Struct2)
; wie kann ich nun auf a von Structure1 zugreifen???
Debug "access"
Debug *Struct\S1 ; das ist deine Adresse
Debug PeekL(*Struct\S1) ; und so liest du sie aus
; und weshalb kann ich in der Definition von Struct2
; nicht *S1.Struct1 schreiben???
; da hab ich selber keine Ahnung...
EndProcedure
AddElement(Structure1())
Structure1()\a = 10 ; a musst du als teil der struktur belegen
Debug Add(@Structure1())
Debug Structure2()\S1
Debug @Structure1()
Access(@Structure2()) Code: Alles auswählen
a = 10Code: Alles auswählen
Structure1()\a = 10Hoffe das hilft dir etwas
Falls Du die Struktur struct1 etwas komplexer hast, kannst Du über diesen Weg dir die Progeammierarbeit etwas erleichtern, kostet aber etwas mehr Rechenzeit...
Dabei nimmst du eine Hilfsvariable, initialisierst die mit der Struktur struct1 und kopierst dann die Inhalte rüber. Dann kannst du mit den üblichen Strukturaddressierungen drauf zugreifen. Bei Änderungen müsst du diese dann eben wieder zurückschreiben. (Siehe das Beispiel im Code)
Code: Alles auswählen
Structure Struct1
a.l
EndStructure
Structure Struct2
S1.l
s2.l
EndStructure
NewList Structure2.Struct2()
NewList Structure1.Struct1()
Procedure.l Add(*Struct.Struct1)
AddElement(Structure2())
Structure2()\S1 = *Struct
ProcedureReturn @Structure2()
EndProcedure
Procedure Access(*Struct.Struct2)
; wie kann ich nun auf a von Structure1 zugreifen???
Debug "access"
Debug *Struct\S1 ; das ist deine Adresse
Debug PeekL(*Struct\S1) ; und so liest du sie aus
; wenn du komplexere Strukturen hast, kannst Du die Arbeit etwas erleichtern, kostet dafür etwas mehr Zeit...
tmp.Struct1
CopyMemory(*Struct\S1, @tmp, SizeOf(Struct1))
Debug "a über hilfsvar: " + Str(tmp\a)
tmp\a = 20
; wenn Du Änderungen machst, kannst du dann wieder so zurückschreiben
CopyMemory(@tmp, *Struct\S1, SizeOf(Struct1))
; und weshalb kann ich in der Definition von Struct2
; nicht *S1.Struct1 schreiben???
; da hab ich selber keine Ahnung...
EndProcedure
AddElement(Structure1())
Structure1()\a = 10 ; a musst du als teil der struktur belegen
Debug Add(@Structure1())
Debug Structure2()\S1
Debug @Structure1()
Access(@Structure2())
Debug "a nach änderung: " + Str(Structure1()\a)
