Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zugriffsverletzung Pointer dereferenzieren (https://www.delphipraxis.net/161967-zugriffsverletzung-pointer-dereferenzieren.html)

CTest 30. Jul 2011 13:50


Zugriffsverletzung Pointer dereferenzieren
 
Hallo,

Ich habe eine Klasse TFlaeche mit der Eigenschaft Item.
Ich möchte Pointer auf Double-Werte dereferenziert in eine TDoubleList schreiben und den Pointer auf den Eintrag in der Liste in ein BTree schreiben. Beim Zugriff auf die Eigenschaft, zeigt der Pointer dann zwar noch auf die Adresse des Eintrags, es kommt aber beim dereferenzieren zur Zugriffsverletzung.

Code:
property Item[const Idx: Integer]: Pointer read GetItem write SetItem; default;
procedure TFlaeche.SetItem(const Idx: Integer; P: Pointer);
var
  idx: Integer;
begin
  FData.Add(Double(P^));
  FDataIdx[idx] := @FData.List^[FData.Count-1];
end;

function TFlaeche.GetItem(const Idx: Integer): Pointer;
begin
  Result := FDataIdx[idx]
end;

Zugriff:
var  d : Double;
...
  d := Double(FFlaeche[idx]^);
Kann mir jemand sagen, was da schief läuft?

vielen Dank

Aphton 30. Jul 2011 14:36

AW: Zugriffsverletzung Pointer dereferenzieren
 
Zeig mal, in welcher Methode die Double Werte hinzugefügt werden.
Ich habe den Verdacht, dass lokale Double-Variablen als Pointer hinzugefügt werden, die sich aber im Verlauf des Programmes ständig ändern usw.!
Tut evt. nichts zur Sache, ist aber ein weiterer potenzieller Bug!

Apropos Setter & Getter - warum verwendest du da 2 Listen? Reicht eine nicht aus?

FredlFesl 30. Jul 2011 19:02

AW: Zugriffsverletzung Pointer dereferenzieren
 
Hä?
Was ist denn FFeld[I,J]?

Nebenbei: Wird in FData die 'List' nicht zwischendurch mal mit 'SetLength' woanders hin gepackt?


Und unter uns: Was Du da machst, ist ziemlich krank. ;-)

jaenicke 30. Jul 2011 19:23

AW: Zugriffsverletzung Pointer dereferenzieren
 
Zitat:

Zitat von FredlFesl (Beitrag 1114247)
Was ist denn FFeld[I,J]?

Ja, ich sehe da auch nicht durch. Was hier ein zweidimensionales Array FFeld mit dem Rest zu tun hat...

Ohne zusammenhängenden Quelltext kann man da nicht viel dazu sagen. Am besten wäre wohl ein kleines abgeschlossenes Demoprojekt...

CTest 30. Jul 2011 21:28

AW: Zugriffsverletzung Pointer dereferenzieren
 
Hallo,
Danke für die Antwort.

Ja, die Double-Werte werden aus einer Datei gelesen und in einer Prozedur hinzugefügt. Da in der TDoubleList Speicher mit ReallocMem reserviert wird, dachte ich der Wert sei dann dort gespeichert, auch nach überschreiben der eingegebenen Variable. FDataIdx ist von einer Klasse TBTree, wo nur die ID und der Pointer eingetragen werden, da die eingegebene Variable später wieder verworfen wird, wollte ich die ebend in die andere Liste eintragen. Und ohne den BTree würde ich nicht mehr über den Index an die Werte kommen, außer ich setze Count von der Liste vorher auf den maximalen Index, dann wäre aber nicht mehr zu unterscheiden, ob der Wert schon gesetzt ist, will dann aber nil zurück haben, wenn der Wert noch nicht gesetzt ist.

Zitat:

Zitat von jaenicke (Beitrag 1114249)
Zitat:

Zitat von FredlFesl (Beitrag 1114247)
Was ist denn FFeld[I,J]?

Ja, ich sehe da auch nicht durch. Was hier ein zweidimensionales Array FFeld mit dem Rest zu tun hat...

Tschuldigung, das wars nicht

FredlFesl 31. Jul 2011 07:01

AW: Zugriffsverletzung Pointer dereferenzieren
 
Beschreib doch einfach mal, was Du machen willst.
Was stellt das Tupel [ID, Double] denn dar?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:22 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