Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Versändnisfrage zu Pointern und Datenzuweisung (https://www.delphipraxis.net/105438-versaendnisfrage-zu-pointern-und-datenzuweisung.html)

Pfoto 21. Dez 2007 18:44


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:
EinPointer^ := Wert;
Edit: Es war bei mir eher so:
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

dominikkv 21. Dez 2007 19:17

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...

gispos 21. Dez 2007 19:30

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

Pfoto 21. Dez 2007 19:43

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:

dominikkv 21. Dez 2007 19:58

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.

DeddyH 21. Dez 2007 19:59

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.

Ghostwalker 22. Dez 2007 08:38

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

Pfoto 22. Dez 2007 09:35

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

Dax 22. Dez 2007 10:49

Re: Versändnisfrage zu Pointern und Datenzuweisung
 
Genau das ist so eine Sache ;) Objekte sind schon Pointer, aber Delphi verschleiert den Fakt recht gut.

Muetze1 22. Dez 2007 19:22

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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:10 Uhr.
Seite 1 von 2  1 2      

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