![]() |
Parameterübergabe - leichte Verwirrung
Hallo,
wenn man was nicht ganz versteht, macht man sich ja ein Beispiel ;-) Ich komme mit Proceduren und wann übergebene Parameter verändert werden noch nicht ganz klar. Mein Beispiel:
Delphi-Quellcode:
Das 'i' bei cbCopy nicht und bei cbVal verändert wird, ist mir sofort logisch. Aber bei img nicht so. Dieses ist ja nach beiden Proceduren verändert. Liegt das darin, daß img eine Art Zeiger auf ein TBitmap-Objekt ist, und wenn ich einen Zeiger kopiere, dann kann ich natürlich den Inhalt, auf den der Zeiger zeigt, ändern?
program Project2;
{$APPTYPE CONSOLE} uses SysUtils,Graphics; Procedure cbCopy(i : Integer); begin i := 1; end; Procedure cbVal(var i : Integer); begin i := 2; end; Procedure cbCopyImg(img : TBitmap); begin img.Width := 20; img.Height := 20;; end; Procedure cbValImg(var img : TBitmap); begin img.Width := 30; img.Height := 30; end; var i : Integer; img : TBitmap; begin i := 0; writeln(Format('i:%d', [i])); cbCopy(i); writeln(Format('i:%d', [i])); cbVal(i); writeln(Format('i:%d', [i])); img := TBitmap.Create; img.Width := 10; img.Height := 10; writeln(Format('w:%d h:%d', [img.Width, img.Height])); cbCopyImg(img); writeln(Format('w:%d h:%d', [img.Width, img.Height])); cbValImg(img); writeln(Format('w:%d h:%d', [img.Width, img.Height])); FreeAndNil(img); Readln; end. Wenn ich den Zeiger selbst in der Procedure umbiegen würde (also auf was anderes zeigen), da würde das Ergebnis bei den beiden Proceduren unterschiedlich aussehen, oder? Jetzt, wo ich das schriebe, wirds mir langsam klar. Ist meine Erkärung so richtig? Danke! Wenn ich was mit OBJECT i; und i := OBJECT.Create anlege, kann ich das dann in allen Proceduren ändern? |
Re: Parameterübergabe - leichte Verwirrung
Zitat:
Noch ein Tipp: Wenn Du genau wissen willst, was sich hinter einer Variable befindet, benutze
Delphi-Quellcode:
. Damit siehst Du am Besten, was sich genau hinter einer Variable oder einem Parameter verbirgt.
SizeOf (AnyVarOrType)
Ach, und was Du sonst noch angenommen hast, stimmt auch A-L-L-E-S :thumb: |
Re: Parameterübergabe - leichte Verwirrung
Du hast Recht.
Wenn man einen Basistyp (int, string, real und Untertypen) ohne "var" übergibt, wird eine Kopie angelegt. Bei Objekten oder komplexen Datentypen wird eine Kopie auf das Original übergeben, egal ob man "var" benutzt oder nicht. Das ist halt bei Delphi so, in anderen Sprachen mag das anderst gelöst sein... |
Re: Parameterübergabe - leichte Verwirrung
Zitat:
Danke an alle! |
Re: Parameterübergabe - leichte Verwirrung
Zitat:
Zitat:
|
Re: Parameterübergabe - leichte Verwirrung
Zitat:
|
Re: Parameterübergabe - leichte Verwirrung
Wie der Zufall es will, bin ich auch darüber gestolpert.
Was muss ich denn machen um bei Objekten nicht das Original zu verändern sonder wirklich nur eine lokale Kopie zu erzeugen diese zu ändern und ggf. nach erst nach einer Abfrage die Änderung zu übergeben? Gruß Karlheinz |
Re: Parameterübergabe - leichte Verwirrung
Also nochmal zu dem Var-zeugs:
Wenn du einen Klassenkonstruktor aufrufst: TObject.Create; Dann wird eine neue Instanz der Klasse erzeugt und ein Pointer auf diese Instanz zurückgegeben. Also ist dann das Ergebnis von: myObject:=TObject.Create; Ein Pointer. Wenn du das jetzt als Parameter übergibst, dann übergibst du diesen Pointer. Und damit greift die Routine auf die gleiche Instanz zu. Nur über einen anderen Pointer. Wenn du jetzt das ganze mit var machst, dann übergibst du einen Pointer auf die angegebene Variable. Bei einfachen Typen wie Strings, Integer, Real... ist das ein ^String, ^Integer, ^Real. Bei Klassen ist das dann logischerweise immer ein ^Pointer. Also ein Pointer auf einen Pointer. Wenn ich jetzt Müll geredet habe, sagt es mir bitte. Danke. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:27 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 by Thomas Breitkreuz