![]() |
2 Arrays definiert - im Endeffekt aber ein und das selbe?
Hallo,
ich habe 2 Arrays definiert:
Delphi-Quellcode:
Durch auftauchende Zugriffsverletzungen habe ich aber das Gefühl, dass es sich hierbei um ein und das selbe handelt (FBufferArray = FWorldArray).
TWorldArray = array of array of TCreature;
TWorld = class(TObject) private [...] FBufferArray: TWorldArray; FWorldArray : TWorldArray; [...] end; Stimmt das? |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Eigentlich sollten es beide Zeiger auf verschiedene Arrays sein... :gruebel:
|
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
vielleicht beachtest du ja irgendwo nicht das es dynamische arrays sind...
|
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
@Chewie: Das dachte ich mir auch. Wenn ich jetzt aber eine Instanz (von TCreature) von meinem FWorldArray in das FBufferArray kopiere, z.B.:
Delphi-Quellcode:
und dann FWorldArray (!) grafisch ausgebe, wird auch die Kopie bei X+1 und Y+1 ausgeben.
FBufferArray[X + 1][Y + 1] := FWorldArray[X][Y];
Der Destruktor gibt zum Schluß dann auch eine AV aus. @gekmihesg: Die beiden Arrays sind genau gleich, d.h. sie haben die gleiche Größe, welche sich auch nicht ändert. |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Das Problem ist jetzt, dass ich es wissen muss, ob FWorldArray und FBufferArray auf das gleiche Array zeigen. Wenn dem so ist, müsste ich alle Prozeduren umschreiben, da ja dann TWorldArray != TBufferArray wäre.
|
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Ich habe noch einmal ein Bisschen rumgespielt und kann jetzt sagen, dass beide definitiv auf das selbe Array zeigen. Hat jemand eine Idee, wie ich das umgehen kann? Bleibt mit da nur die Möglichkeit, ein 2. Array zu erstellen? Bsp:
Delphi-Quellcode:
Das muss doch einfacher gehen, verdammte Sche*ße. :evil: :evil: :evil:
TBufferArray = array of array of TCreature;
TWorldArray = array of array of TCreature; TWorld = class(TObject) private [...] FBufferArray: TBufferArray; FWorldArray : TWorldArray; [...] end; |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
auf seine eigenen antworten sollte man innerhalb von 24 nicht antworten, editier doch deinen beitrag nächstes mal. So sind hier eben die Regeln :thuimb:
zum thema kann ich leider auch nichts sagen :\ |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Zitat:
Ich merk's mir. |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Ich hab das jetzt auch mal ausprobiert, ausgehend von deiner ersten Deklaration:
Delphi-Quellcode:
Ergebnis: Ist das Array noch nicht initialisiert, zeigen beiden wirklich auf die selbe Adresse, nämlich 0! Klar, sind ja auch nil-Pointer. Erst nach dem Festlegen der Länge zeigen sie wirklich auf verschiedene Adressen, zumindest bei mir (D5).
with TWorld.Create do
begin //uninitialisiert ShowMessage(Format('FBufferArray: %p, FWorldArray: %p', [FBufferArray, FWorldArray])); //auf Länge 1 SetLength(FBufferArray, 1); SetLength(FWorldArray, 1); ShowMessage(Format('FBufferArray: %p, FWorldArray: %p', [FBufferArray, FWorldArray])); Free; end; |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Mehr als komisch, mein Contructor:
Delphi-Quellcode:
Vielleicht liegt es an der Zuweisung?
TWorldArray = array of array of TCreature;
TWorld = class(TObject) private FBufferArray: TWorldArray; FWorldArray : TWorldArray; public constructor Create(BlockNumX, BlockNumY, BlockHeight, BlockWidth: Integer); destructor Destroy; override; [...] procedure BufferCreature(SourceX, SourceY, TargetX, TargetY: Integer; BufferArray, WorldArray: TWorldArray); [...] property BufferArray: TWorldArray read FWorldArray; property WorldArray: TWorldArray read FWorldArray; end; [...] constructor TWorld.Create(BlockNumX, BlockNumY, BlockHeight, BlockWidth: Integer); var i: Integer; j: Integer; begin [ ... ] SetLength(FBufferArray, BlockNumX, BlockNumY); SetLength(FWorldArray, BlockNumX, BlockNumY); for i := 0 to FBlockNumX - 1 do for j := 0 to FBlockNumY - 1 do begin FBufferArray[i][j] := TSand.Create(i, j); FWorldArray[i][j] := TSand.Create(i, j); end; end;
Delphi-Quellcode:
(Ich wollte jetzt zu 100% sicher gehen und habe die Arrays mit übergeben. Es ist natürlich klar, dass ich nur die Instanz der Klasse übergeben müsste, da ich ja per properties auf die Arrays zugreifen könnte.)
procedure TWorld.BufferCreature(SourceX, SourceY, TargetX, TargetY: Integer;
BufferArray, WorldArray: TWorldArray); begin BufferArray[TargetX][TargetY] := WorldArray[SourceX][SourceY]; end; Würde bei dieser Zuweisung wirklich eine Kopie erstellt werden? |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Lass dir einfach mal, so wie ich es gemacht habe, die Adressen ausgeben, und du siehst 100%ig, ob es sich um das gleiche Array handelt oder nicht.
|
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Zitat:
Delphi-Quellcode:
also ohne Indezes wird der Pointer übergeben, und es entsteht das von dir beschriebene Szenario. Schau mal, ob du irgendwo im Code sowas wie oben drin hast. Dann ist alles klaro.
BufferArray := WorldArray;
gruss, dizzy \edit: Nen Plural zum Singular degradiert :) |
Re: 2 Arrays definiert - im Endeffekt aber ein und das selbe
Zitat:
Danke! :dp: Ich kombiniere mal: Wenn ich ein Objekt (Instanz) von ArrayA nach ArrayB kopieren will, spuckt der Destructor beim beenden ein EInvalidPointer aus. Wenn ich auf dem ArrayB aber ein neues Objekt erstelle (TMeineKlasse.Create) funktioniert alles wunderbar. D.h. es wird nur der Pointer übergeben. Demnach muss es der Zuweisung liegen:
Delphi-Quellcode:
Hatte mir sowas schon gedacht. Wie kann ich denn ein Objekt von ArrayA nach ArrayB kopieren? Ich habe da keinen blassen Schimmer, deswegen auch die Zuweisung.
procedure TWorld.BufferCreature(SourceX, SourceY, TargetX, TargetY: Integer;
World: TWorld); begin World.FBufferArray[TargetX][TargetY] := World.FWorldArray[SourceX][SourceY]; end; Hat sich erledigt! Danke an Chewie! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz