[List] "Absturz bei Verändern eines Elements"
Verfasst: 29.01.2015 19:25
Hallo,
der Titel ist nicht allzu aussagekräftig, da mein Problem vermutlich sehr speziell ist. Mein Programm stürzt mit "Invalid Memory Access" ab, wenn ich ein Attribut eines Elements einer Liste verändere und "anschließend" auf das nachfolgende Element zugreifen möchte. Ein Auszug aus meinem Code, der zunächst problemlos läuft:
"*g" ist dabei eine Struktur:
Wenn ich aber nun an einer anderen Stelle auf ein Element der Liste zugreife und dort ein Attribut verändere, knallt es in Zeile mit Kommentar 1, nachdem allerdings zuvor die Schleife mit dem veränderten Element noch problemlos durchläuft (d. h. es wird Kommentarzeile 2 ausgeführt, dann beim nächsten Durchlauf gibt es Probleme).
Ein Beispiel verdeutlicht vielleicht etwas besser, was ich meine. In der Liste sind 6 Elemente. Ich verändere das 4. Element (Code folgt unten). Die While-Schleife wird dann 4 Mal korrekt ausgeführt, beim Zugriff auf das 5. Element scheitert der Zugriff aber.
Der Code, der das Element verändert:
Auszug aus "Object":
Wird von "Data" ein Attribut geändert, stürzt das später Programm ab. Ändere ich hingegen "Name" von *obj, läuft es korrekt. An "Data" wurde bei Erzeugen des Objektes mit "AllocateStructure(MagnetData)" Speicher zugewiesen, der ja eigentlich auch unabhängig von der Umgebung vom Objekt sein sollte. Was geschieht hier also?
Ich hoffe, dass mein Problem klar geworden ist, und ein (oder mehrere) schlaue Menschen Rat haben.
der Titel ist nicht allzu aussagekräftig, da mein Problem vermutlich sehr speziell ist. Mein Programm stürzt mit "Invalid Memory Access" ab, wenn ich ein Attribut eines Elements einer Liste verändere und "anschließend" auf das nachfolgende Element zugreifen möchte. Ein Auszug aus meinem Code, der zunächst problemlos läuft:
Code: Alles auswählen
; Iteriere über alle Elemente der Liste (Kommentare sind durchnummeriert)
ResetList(*g\Objects())
While NextElement(*g\Objects())
Debug *g\Objects() ; 1.
Define *mag.Object = *g\Objects()
Define *mData.MagnetData = *mag\Data
Debug "*mag = " + *mag
Debug "Name = " + *mag\Name ; 2.
Code: Alles auswählen
Structure GameField
Array *Blocks.Object(0, 0)
List *Objects.Object()
Height.l
Width.l
EndStructure
Ein Beispiel verdeutlicht vielleicht etwas besser, was ich meine. In der Liste sind 6 Elemente. Ich verändere das 4. Element (Code folgt unten). Die While-Schleife wird dann 4 Mal korrekt ausgeführt, beim Zugriff auf das 5. Element scheitert der Zugriff aber.
Der Code, der das Element verändert:
Code: Alles auswählen
Define *obj.Object = MouseOverObject(*curLevel\GameField, MouseX(), MouseY()) ; Liefert das korrekte Element (Pointer sind identisch)
If *obj <> #Null And *obj\Type = #Magnet
Define *mData.MagnetData = *obj\Data
Debug *mData\IsActive ; Liefert 0 (wie erwartet)
*mData\IsActive = LNot(*mData\IsActive) ; Verändern des Wertes. Wird diese Zeile auskommentiert, läuft alles korrekt
Debug *mData\IsActive ; Liefert 1 (wie erwartet)
EndIf
Code: Alles auswählen
Structure Object
Name.s ; Non-unique name of the object
*Data ; Additional data if needed
EndStructure
Ich hoffe, dass mein Problem klar geworden ist, und ein (oder mehrere) schlaue Menschen Rat haben.