Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Pionter nach Setlength ungültig? (https://www.delphipraxis.net/150112-pionter-nach-setlength-ungueltig.html)

Teekeks 7. Apr 2010 17:20


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:
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
Was mach ich hier falsch?

himitsu 7. Apr 2010 17:24

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:

schreibt irgendetwas anderes
Oder ergibt eine Zugriffsverletzung (Exception), wenn an der Stelle nicht zufällig einen reservierter Speicherbereich liegt.

Teekeks 7. Apr 2010 17:34

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 :)

himitsu 7. Apr 2010 17:40

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)^));

Teekeks 7. Apr 2010 18:41

Re: Pionter nach Setlength ungültig?
 
Ahh,
Ich hab dann doch das erste genommen :)

uligerhardt 7. Apr 2010 19:12

Re: Pionter nach Setlength ungültig?
 
Ich würde mir einfach den Index eines Elements merken statt einen Zeiger darauf.

Blup 8. Apr 2010 07:55

Re: Pionter nach Setlength ungültig?
 
Mit Objekten statt mit Records arbeiten, dann existiert diese Problem erst garnicht.

uligerhardt 8. Apr 2010 08:07

Re: Pionter nach Setlength ungültig?
 
Zitat:

Zitat von Blup
Mit Objekten statt mit Records arbeiten, dann existiert diese Problem erst garnicht.

Dafür existieren - je nach Anwendungsszenario - andere: Man muss sich plötzlich um Erzeugung und Entsorgung kümmern, Kopieren funktioniert nicht mehr so einfach etc.pp. Manches geht in Delphi mit Klassen besser, manches mit Records.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz