Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Pointer (https://www.delphipraxis.net/144751-problem-mit-pointer.html)

blablab 15. Dez 2009 20:45


Problem mit Pointer
 
Hallo!

Ich würde gerne Daten in eine TTreeNode speichern. Dazu hat TTreeNode die Eigenschaft Data: Pointer der ich etwas zuweisen möchte.

Ich habe:

Delphi-Quellcode:
TNodeData = record
   str: string;
   bool: Boolean;
end;
NodeData: array of TNodeData;
Folgender Code geht nicht:
Delphi-Quellcode:
NodeData[idx].str := 'Hallo';
node.Data := @(NodeData[idx]);
...
if Assigned(node.Data) then begin
   Result := TNodeData(node.Data^).str;
end;
Hier kommt eine Zugriffsverletzung.
Was mach ich falsch??

Grüße
blablab

-=Breeze=- 15. Dez 2009 21:09

Re: Problem mit Pointer
 
Guten Abend,
es wäre schön wenn du sagen würdest, wo genau der Fehler auftritt.

Laut deinem Code würde ich sagen, dass schon
Delphi-Quellcode:
NodeData[idx] := 'Hallo'
eine Zugriffsverletzung bringt.

Du hast ein dynamisches Array und dessen Länge noch nicht definiert :)

blablab 15. Dez 2009 21:11

Re: Problem mit Pointer
 
Der Fehler tritt auf bei
Delphi-Quellcode:
Result := TNodeData(node.Data^).str;
-> Zugriffsverletzung

himitsu 15. Dez 2009 21:23

Re: Problem mit Pointer
 
Das Array NodeData, auf welches dein Zeiger zeigt, existiert aber noch?

blablab 15. Dez 2009 21:28

Re: Problem mit Pointer
 
ja, ich hab testweise folgendes gemacht
Delphi-Quellcode:
NodeData[idx].str := 'Hallo';
node.Data := @(NodeData[idx]);
ShowMessage(TNodeData(node.Data^).str);
-> Zugriffsverletzung

blablab 15. Dez 2009 21:38

Re: Problem mit Pointer
 
Delphi-Quellcode:
TNodeData = record
   str: string;
   bool: Boolean;
end;
PNodeData = ^TNodeData;
NodeData: array of PNodeData;
Dann bekomme ich bei
Delphi-Quellcode:
Result := PNodeData(node.Data)^.str;
oder
Delphi-Quellcode:
Result := TNodeData(node.Data^).str;
keine Zugriffsverletzung mehr, dafür bekomme ich aber immer nur NodeData[0].str zurück, auch wenn der Node ein völlig anderer Index al 0 zugewiesen wurde.

himitsu 15. Dez 2009 21:41

Re: Problem mit Pointer
 
hmmmm :gruebel:

Im Nodefall sollte es auch so gehn,
Delphi-Quellcode:
NodeData[idx].str := 'Hallo';
node.Data := Pointer(idx);
ShowMessage(NodeData[Integer(node.Data)].str);
welches auch einen Vorteil hat:
Wird das Array verändert (neue Einträge angehängt),
dann stimmt der Index immernoch, wärend sich die Arraydaten aber verschoben haben können.

Medium 15. Dez 2009 22:07

Re: Problem mit Pointer
 
Zitat:

Zitat von himitsu
Nodefall

Ächtz... AUA! :lol: Doch nicht mitten in der Woche SO einer :freak:

blablab 15. Dez 2009 22:12

Re: Problem mit Pointer
 
@himitsu:
Jetzt versteh ichs! Danke!
Ich benutze einen dynamisches Array dessen Größe ich gelegentlich vergrößere. Das bedeutet es gibt nicht genug Platz um den Array zu vergrößern, also wird er woanders hinkopiert -> die Pointer sind ungültig.
Daran hab ich überhaupt nicht gedacht, danke!

p.s: "nodefall" nettes wortspiel :lol:

himitsu 15. Dez 2009 22:28

Re: Problem mit Pointer
 
Na dann :lol:

Eine andere Möglichkeit wäre noch, daß du nach einem SetLength die Pointer anpaßt, bzw. mitverschiebst.


@Medium: OK, ich sag meinem Unterbewußtsein, daß es nächstes Mal bis zum Wochenende warten soll.


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