Irgendwie ist die Hilfe widersprüchlich:
1. "Die Ziel-Struktur [wird?] vor dem Kopieren automatisch gelöscht - es ist nicht nötig, ClearStructure vor CopyStructure aufzurufen"
2. "Warnung: Das Ziel sollte ein gültiger Struktur-Speicherbereich oder ein gelöschter Speicherbereich sein. Wenn der Speicherbereich nicht geleert ist, kann es zu einem Absturz kommen, da von der Lösch-Routine zufällige Werte genutzt werden."
CopyStructure - Ziel löschen oder nicht?
- NicTheQuick
- Ein Admin
- Beiträge: 8807
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
Re: CopyStructure - Ziel löschen oder nicht?
Nein, es stimmt schon. Es ist nur schwer zu verstehen, was damit gemeint ist. Vielleicht hilft dir das folgende Beispiel. Kommentare inliegend.
Code: Alles auswählen
Structure MyStructure
List MyList.i()
EndStructure
; Wir erstellen einen genullten Speicherbereich für unsere Struktur.
; Damit ist der Speicherbereich schon mal "gültig" und "geleert" um
; es mit den Worten aus der Hilfe auszudrücken.
Define *a.MyStructure = AllocateStructure(MyStructure)
; Wir können hier so oft 'ClearStructure()' aufrufen wie wir wollen,
; da der Speicherbereich bereits genullt ist und somit kein Pointer
; verfolgt werden kann, der auf eine LinkedList zeigen könnte
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
; Wenn wir die Struktur korrekt initialisieren, wird ein gültiger
; Pointer zur darin enthaltenen LinkedList erstellt.
InitializeStructure(*a, MyStructure)
Debug "Der Pointer zur LinkedList: " + StrU(PeekI(*a), #PB_Integer)
; Danach können wir sie wieder beliebig oft freigeben mit
; 'ClearStructure()'. Tatsächlich gibt aber nur das erste die
; LinkedList wieder frei. Alle anderen tun nichts.
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
ClearStructure(*a, MyStructure)
Debug "Der Pointer nach ClearStructure: " + StrU(PeekI(*a), #PB_Integer)
; Jetzt machen wir den Speicherbereich gültig, aber nicht "leer",
; indem wir zufällige Daten rein schreiben.
RandomData(*a, SizeOf(MyStructure))
Debug "Der ungültige Pointer zur vermeintlichen LinkedList: " + StrU(PeekI(*a), #PB_Integer)
; Wenn wir jetzt 'ClearStructure()' aufrufen, versucht die Routine
; dem höchstwahrscheinlich ungültigen Pointer zur LinkedList zu
; folgen um sie zu löschen. Das wird fehlschlagen.
ClearStructure(*a, MyStructure)