Autor Beitrag
CyDek
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 30.06.11 20:07 
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:
ausblenden 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:
ausblenden 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:
ausblenden 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 ..."

ausblenden 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:
ausblenden Delphi-Quelltext
1:
Previous:=Addr(NextPrevious);					


Vielen dank für jede Antwort.

MfG
CyDek

@Edit: Einige Rechtschreib bzw Grammatikfehler entfernt.
CyDek Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 01.07.11 15:57 
Hier bin ich nochmal,

und habe mir das Problem nocheinmal genauer angeschaut.
Irgendwie scheine ich keine Schreibrechte auf die
Variable "Previous" zu haben, denn wenn ich folgenden Code
ausführe:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TMyArray.SetPrevious(p: pointer);
var
Point: Pointer;
begin
point:=Previous;
Previous:=point;
end;


Dann bleibt mein Programm bei "Previous:=point;" stehen,
wieder mit der Meldung:
"Im Projekt Project2.exe ist eine Exception der Klasse EAccesViolation aufgetreten. Meldung:
'Zugriffsverletzung bei Adresse 0044D217 in Modul 'Project2.exe'. Schreiben von Adresse
004030AC'. Prozess wurde angehalten. Mit Einzelne Anweisung oder Start fortsetzen'

Ich verstehe aber immernoch nicht, wo das Problem liegt.
Kann irgend jemand helfen?
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 01.07.11 16:06 
Hallo und :welcome:

user profile iconCyDek hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
Array1:= @TMyArray.Create;
Array2:= @TMyArray.Create;
Array1.SetPrevious(Array2.GetPrevious);
Auf den ersten Blick würde ich sagen das Problem ist, dass du in Array1 dort nicht eine Referenz auf die Klasse speicherst, sondern versuchst die Adresse der Referenz auf die Klasse zu speichern. Nimm einfach die @ Zeichen weg. Eine Klassenreferenz ist selbst schon ein (versteckter) Pointer.
Yogu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2598
Erhaltene Danke: 156

Ubuntu 13.04, Win 7
C# (VS 2013)
BeitragVerfasst: Fr 01.07.11 16:35 
Muss es denn eine verknüpfte Liste sein, oder geht auch eine normale Array-Liste? Dann könntest du ja auch eine TList nehmen, und müsstest nichts mehr programmieren. Der Nachteil dabei ist, dass die Listenelemente alle an einen euen Speicherplatz kopiert werden müssen, wenn du einn neuen Eintrag hinzufügst. Da du aber sowieso nur Pointer drin hast, dürfte das nicht so viel ausmachen.
Bergmann89
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1742
Erhaltene Danke: 72

Win7 x64, Ubuntu 11.10
Delphi 7 Personal, Lazarus/FPC 2.2.4, C, C++, C# (Visual Studio 2010), PHP, Java (Netbeans, Eclipse)
BeitragVerfasst: Fr 01.07.11 16:45 
Hey,

user profile iconYogu hat folgendes geschrieben Zum zitierten Posting springen:
Der Nachteil dabei ist, dass die Listenelemente alle an einen euen Speicherplatz kopiert werden müssen, wenn du einn neuen Eintrag hinzufügst.
Wenn er die Größe der Liste am Anfang festlegt wird ausreichend Speicher reserviert un es muss später nix mehr umkopiert werden ;)
Wenns wirklich ne DoubleLinkedList sein soll, da hab ich auch schonma ne Unit zu geschrieben: DoubleLinkedList

MfG Bergmann.

_________________
Ich weiß nicht viel, lern aber dafür umso schneller^^
CyDek Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 01.07.11 21:52 
Vielen Dank für die Antworten,
ich bin gerade unterwegs, werde die
Vorschläge aber ausprobieren sobald ich Zuhause bin.

MfG
CyDek