![]() |
Versändnisfrage zu Pointern und Datenzuweisung
Hallo zusammen,
ich arbeteite seit einigen Tagen mit dem VirtualStringTree und muss mich deshalb auch mit Pointern beschäftigen. In den Tutorials zu Pointern habe ich gelernt dass eine Zuweisung durch eine Dereferenzierung geschehen muss:
Delphi-Quellcode:
Edit: Es war bei mir eher so:
EinPointer^ := Wert;
Delphi-Quellcode:
EinPointer^ := EinObjekt;
Nun hatte ich das Dach (^) mal vergessen und merkwürdigerweise funktionierte die Zuweisung ebenfalls problemlos. Ist das eine "großzügige" Einstellung in Delphi die sowas erlaubt? In den Optionen unter "Compiler" finde ich dahingehend jedoch nichts. Wäre einfach schön zu wissen warum das trotzdem funktionert. Dank und Gruß Pfoto |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Eigendlich müsstest du damit dann den Pointer geändert haben...
...es sei dem Delphi hat wegen der Code-Optimierung keinen "richtigen" Pointer drausgemacht, sondern, da die zu speichernden Daten < 4 Byte sind zB, gleich den Wert in die Speicherstelle geschrieben... |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Kommt natürlich darauf an als was dein Pointer Deklariert ist. Wenn Du den Pointer
als ^Integer (Pointer auf Integer) deklariert hast, gibt es dann bei einer Zuweisung eines anderen Integeren Wertes der ebenfalls ein Pointer ist, keine Probleme. Gruß gispos |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Ich habe das hier deklariert:
Delphi-Quellcode:
PTreeData = ^TTreeData;
TTreeData = record TreeObj: TBaseTreeObj; end; Heißt das also im Klartext, nur wenn ich etwas größeres als einen Integer per Pointer deklariere, wäre eine Dereferenzierung notwendig? Mit der Dereferenzierung macht man den Compiler also nur darauf aufmerksam, das da mehr kommt als ein Integer? So ganz habe ich es wohl noch nicht verstanden... :gruebel: |
Re: Versändnisfrage zu Pointern und Datenzuweisung
mach einfach immer Pointer^ := ...also mit Dach.
Du weißt nicht ob das immer klappt und irgendwann hast du ne Zugriffsverletzung. |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Außerdem ist es richtig ;) und Du siehst auch nach Jahren noch, dass Du hier einen Pointer dereferenzierst.
|
Re: Versändnisfrage zu Pointern und Datenzuweisung
Der Unterschied ist folgender:
Ohne Dereferenzierung (also ohne ^) änderst du die Adresse, auf die der Zeiger zeigt. Mit Dereferenzierung (also mit ^) änderst du den Inhalt, auf den der Zeiger zeigt. Wenn du einen Zeiger mit Getmem/New erzeugst und änderst die Adresse (ohne Dereferenzierung also), dann erzeugst du ein Memory-Leak, da du diesen Speicher angelegt hast, ihn aber nie wieder freigeben kannst (schließlich überschreibst du die Adresse). Also..immer schön ans ^ denken :) |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Achso!
Es ging also nur deshalb, weil ich dem Pointer ein Objekt zugewiesen habe und damit ja auch wieder nur einen Pointer, also eine Adresse, verteilt habe. Danke Euch allen! Gruß Pfoto |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Genau das ist so eine Sache ;) Objekte sind schon Pointer, aber Delphi verschleiert den Fakt recht gut.
|
Re: Versändnisfrage zu Pointern und Datenzuweisung
... und Delphi setzt die Dereferenzierung nicht mehr explizit voraus seit D6. Dort kann man den ^ auch weglassen. Folgendes ist ohne Probleme möglich:
Delphi-Quellcode:
type
PTest = ^TTest; TTest = record a: integer; b: integer; end; procedure Test; var lTest: PTest; begin New(lTest); try lTest.a := 4; lTest.b := lTest^.a; finally Dispose(lTest); end; end; |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Eingeschränkt richtig. Dort wo es eindeutig ist, gibts keine Probleme, aber folgendes sollte man lassen:
Delphi-Quellcode:
Hier wird der Compiler auch nicht meckern, aber scheppern wirds trotzdem (spätestens beim freigeben).
var
p : Pointer; o : TObject; begin o := TObject.create; GetMem(p 400); p := 0; : end; |
Re: Versändnisfrage zu Pointern und Datenzuweisung
Dein Beispiel hat aber nichts mit dem (nun) optionalen Dereferenzierungsoperator zu tun, sondern mit der Zuweisungskompatibilität bei ähnlichen Typen. Die Basis ist bei beiden Pointer und eine Größe von 4 Bytes und von daher möglich.
|
Re: Versändnisfrage zu Pointern und Datenzuweisung
Und genau um so etwas gehts im Thread hier (siehe 1. Post) :)
Egal, letztendlich haben wir beide Recht :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:16 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