Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Unterschied Pointer/Referenzvariablen (https://www.delphipraxis.net/64297-unterschied-pointer-referenzvariablen.html)

Frickeldrecktuxer_TM 1. Mär 2006 21:21

Re: Unterschied Pointer/Referenzvariablen
 
Zitat:

Zitat von GuenterS
Zitat:

Zitat von sniper_w
Zitat:

Seit wann ist dem so???
Seit es Delphi gibt.
Zitat:

Das trifft nur auf einfache Datentypen zu nicht aber auf Objekte.
Stimmt nicht.
Zitat:

c++ kenntnisse können hier hilfreich sein da man dort eine klare trennung zwischen objekten und objektreferenzen hat.
Das kann man nur zustimmen.

So jetzt widerlege ich mal die ersten zwei Punkte von Sniper_w, sogar mit Beweis zum selber ausprobieren. :-)

Hab ihn als Anhang angehängt.

Man wird darin sehen, dass es keinen Unterschied macht ob ich nun

"var MyOBJ: TMyClass" oder "MyObj: TMyClass" schreibe

man wird sehen, dass es einen Unterschied macht ob ich nun

"myInt: integer" oder "var myInt: integer" schreibe.

ich hatte recht. du verwechselst objekt und objektreferenz. es gibt keinerlei wiederspruch deines codes zu meinen aussagen. um das zu tun was ich in meinem ersten beitrag angesprochen habe (das objekt ändern und nicht nur member des objektes) brauchst du faktisch einen var parameter oder einen pointer auf die objektreferenz wie in meinen beispielen gezeigt. deine aussage das alle objekte in der parameterliste einer funktion automatisch var parameter sind ist ganz einfach falsch.

sniper_w 1. Mär 2006 21:25

Re: Unterschied Pointer/Referenzvariablen
 
Versuch deinem Objekt nil zuzuweissen in deine Prozedur.
Delphi-Quellcode:
procedure myProc( obj:TObject );
begin
  obj := nil;
end;
//
var
  o:TObject;
begin
  o := TObject.Create();
  myProc( o );
  if o<>nil then
   Application.MessageBox('sniper hatte recht','sniper');

  o.free;
end;

xaromz 1. Mär 2006 21:26

Re: Unterschied Pointer/Referenzvariablen
 
Hallo Günter,

keiner hier hat behauptet, dass es keinen Unterschied macht, ob Du Parameter mit var oder ohne übergibst. Der Unterschied zwischen Objekten und primitiven Typen ist der, dass ein Objekt eigentlich ein Pointer ist und damit var unnötig ist, um die Member eines Objektes zu verändern. Es wird ja nicht das Objekt kopiert und lokal verwendet, sondern tatsächlich das übergebene Objekt verwendet.
Damit kann ich das Objekt manipulieren; wenn Du aber die Objektreferenz selbst ändern möchtest, dann musst Du natürlich var verwenden.

BlackJack 1. Mär 2006 21:30

Re: Unterschied Pointer/Referenzvariablen
 
genau:
Delphi-Quellcode:
procedure Test1(AObj: TObject);
  begin
  AObj := TObject.Create;
  end;

procedure Test2(var AObj: TObject);
  begin
  AObj := TObject.Create;
  end;


var O1, O2: TObject;
begin
O1 := TObject.Create;
O2 := O1;
Test1(O1);
// hier ist O1 = 02:
if O1 = O2 then
  ShowMessage('Hah ;D ');

O1 := TObject.Create;
O2 := O1;
Test2(O1);
//hier ist O1 <> O2
if O1 <> O2 then
  ShowMessage('Hah ;D ');

end;

GuenterS 1. Mär 2006 21:30

Re: Unterschied Pointer/Referenzvariablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ja ok, ich gebs ja zu ... befand mich ein wenig am Irrweg. Konnte man aber deutlich an meinem Beispiel sehen und für diese Fälle ists ja wirklich wurscht.


Hab diese zwei Varianten auch noch dazugepackt in mein TestProjekt, kann man sich anhand des Quellcodes gut anschaun. Vielleicht hilf diese Diskussion ja auch noch jemand anderen, diese "Falle" zu vermeiden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Seite 2 von 2     12   

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