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.