![]() |
Pionter nach Setlength ungültig?
Hallo!
Ich habe hier ein Pointer auf ein Element eines Array of integer; Nach einem Setlength scheint aber der wert, auf den der Pointer zeigt, nicht mehr der gleiche zu sein... Beispiel:
Delphi-Quellcode:
Was mach ich hier falsch?
Setlength(intarr,1);
intarr[0]:=10; pint:=@intarr[0]; Writeln(inttostr(Integer(pint^))); // schreibt 10 Setlength(intarr,Length(intarr)+1); Writeln(inttostr(Integer(pint^))); // schreibt irgendetwas anderes |
Re: Pionter nach Setlength ungültig?
Wenn das Array nicht "inplace" in seiner Größe verändert werden kann, dann wird ein neues Array angelegt und der inhalt kopiert ... ergo, die Pointer stimmen dann nicht mehr. :stupid:
Zitat:
|
Re: Pionter nach Setlength ungültig?
Wie löse ich das dann?
ich hab hier auch ein anderes Array was als variable u.A. einen Pointer auf das Element dieses Arrays haben soll. Daher benötige ich diesen Pointer durchaus :) |
Re: Pionter nach Setlength ungültig?
Standardlösung: Lese die Pointer nach der Größenänderung neu aus. :zwinker:
Man kann es aber auch Mathematisch lösen :angel2:
Delphi-Quellcode:
SetLength(intarr, 1);
intarr[0] := 10; pint := @intarr[0]; WriteLn(IntToStr(PInteger(pint)^)); Dec(Cardinal(pint), Cardinal(intarr)); SetLength(intarr, Length(intarr) + 1); Inc(Cardinal(pint), Cardinal(intarr)); // aka: // palt := intarr; // SetLength(intarr, Length(intarr) + 1); // pint := pint - palt + intarr; WriteLn(IntToStr(PInteger(pint)^)); |
Re: Pionter nach Setlength ungültig?
Ahh,
Ich hab dann doch das erste genommen :) |
Re: Pionter nach Setlength ungültig?
Ich würde mir einfach den Index eines Elements merken statt einen Zeiger darauf.
|
Re: Pionter nach Setlength ungültig?
Mit Objekten statt mit Records arbeiten, dann existiert diese Problem erst garnicht.
|
Re: Pionter nach Setlength ungültig?
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 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