Guten Abend zusammen,
ich arbeite zur Zeit an einem Informatik-Projekt in Delphi.
Idee ist es ein kleines "Space-Invaders" auf die Beine zu stellen,
auf Images und Shapes basierend halt.
Jetzt wollte ich für die "Gegner-Images" (Also die Teile, die später oben rumfliegen)
ein Array von Zeigern erstellen, da ich die Images ja zur Laufzeit erstellen und wieder
freigeben können muss. Allerdings wollte ich hier weder unnötig Speicherplatz verschwenden,
noch mich durch ein festes Array einschränken, also habe ich mir gedacht ich mache so eine Art
Zeiger-Kette. Also:
Ein Objekt mit 3 Zeigern:
Zeiger 1 zeigt auf das vorherige Kettenobjekt
Zeiger 2 zeigt auf das nächste Kettenobjekt
Zeiger 3 zeigt auf das Image/Shape etc.
Mein bisheriger Klassenaufbau ist der folgende:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| TMyArray= class private Previous, Next: Pointer; Me: Pointer; public procedure SetPrevious(PreviousOne: pointer); procedure SetNext(NextOne: pointer); function GetPrevious: Pointer; function GetNext: Pointer; end; |
(Me zeigt auf das Image)
die procedure SetPrevious ist wie folgt definiert:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure TMyArray.SetPrevious(PreviousOne: pointer); var NextPrevious: Pointer; begin NextPrevious:=Addr(Previous); try NextPrevious:=Addr(PreviousOne); finally Previous:=Addr(NextPrevious); end; end; |
und die function GetPrevious wie folgt:
Delphi-Quelltext
1: 2: 3: 4:
| function TMyArray.GetPrevious:Pointer; begin result:=Addr(Previous); end; |
Die Set- und GetNext procedure/function sind genauso aufgebaut.
Wenn ich nun aber in meinem Code auf die Prozeduren zugreifen möchte, erhalte ich eine
"Zugriffsverletzung bei Adresse ..."
Delphi-Quelltext
1: 2: 3:
| Array1:= @TMyArray.Create; Array2:= @TMyArray.Create; Array1.SetPrevious(Array2.GetPrevious); |
Der Fehler liegt in der 3. Zeile, also bei Ausführung der SetPrevious-Funktion.
Innerhalb der SetPrevious-Funktion wird der Fehler in der letzten Zeile angezeigt:
Delphi-Quelltext
1:
| Previous:=Addr(NextPrevious); |
Vielen dank für jede Antwort.
MfG
CyDek
@Edit: Einige Rechtschreib bzw Grammatikfehler entfernt.