![]() |
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? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:31 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