AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterübergabe - leichte Verwirrung

Ein Thema von rowkajjh · begonnen am 16. Jan 2006 · letzter Beitrag vom 18. Jan 2006
Antwort Antwort
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#1

Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 17:54
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:
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.
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?

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?
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 18:03
Zitat von rowkajjh:
... 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?...
Genauso ist es. Es hat bei mir auch einige Zeit gedauert (und genau so ein Aha-Erlebnis), bis ich auf den Trichter mit den Objekten und Zeigern gekommen bin.

Noch ein Tipp: Wenn Du genau wissen willst, was sich hinter einer Variable befindet, benutze SizeOf (AnyVarOrType) . Damit siehst Du am Besten, was sich genau hinter einer Variable oder einem Parameter verbirgt.

Ach, und was Du sonst noch angenommen hast, stimmt auch A-L-L-E-S
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Benutzerbild von RavenIV
RavenIV

Registriert seit: 12. Jan 2005
Ort: Waldshut-Tiengen
2.875 Beiträge
 
Delphi 2007 Enterprise
 
#3

Re: Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 18:14
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...
Klaus E.
Linux - das längste Text-Adventure aller Zeiten...
Wer nie Linux mit dem vi konfiguriert hat, der hat am Leben vorbei geklickt.
  Mit Zitat antworten Zitat
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#4

Re: Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 18:47
Zitat von RavenIV:
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...
Ist ja okay so. Wenn mans weiß...

Danke an alle!
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#5

Re: Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 19:23
Zitat von RavenIV:
Wenn man einen Basistyp (int, string, real und Untertypen) ohne "var" übergibt, wird eine Kopie angelegt.
Nicht nur die einfachen Typen (wobei string nicht zu ihnen gehört) gehören zu den sogenannten Wertetypen (<=> Referenztypen), auch statische Arrays und Records gehören dazu.
Zitat:
Das ist halt bei Delphi so, in anderen Sprachen mag das anderst gelöst sein...
Solange in der anderen Sprache ein Delphi-Wertetyp nicht zu einem Verweistyp oder andersherum wird, sollte sich eigentlich nichts Großes ändern.
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
rowkajjh

Registriert seit: 9. Jan 2006
38 Beiträge
 
#6

Re: Parameterübergabe - leichte Verwirrung

  Alt 16. Jan 2006, 19:58
Zitat von Khabarakh:
Zitat von RavenIV:
Wenn man einen Basistyp (int, string, real und Untertypen) ohne "var" übergibt, wird eine Kopie angelegt.
Nicht nur die einfachen Typen (wobei string nicht zu ihnen gehört) gehören zu den sogenannten Wertetypen (<=> Referenztypen), auch statische Arrays und Records gehören dazu.
Nochmehr? Oder kann man das irgendwo in der Hilfe oder sonstwo genauer nachlesen?
  Mit Zitat antworten Zitat
KHJ

Registriert seit: 15. Dez 2005
35 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Parameterübergabe - leichte Verwirrung

  Alt 18. Jan 2006, 18:27
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
Karlheinz Jansen
  Mit Zitat antworten Zitat
Benutzerbild von 3_of_8
3_of_8

Registriert seit: 22. Mär 2005
Ort: Dingolfing
4.129 Beiträge
 
Turbo Delphi für Win32
 
#8

Re: Parameterübergabe - leichte Verwirrung

  Alt 18. Jan 2006, 18:34
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.
Manuel Eberl
„The trouble with having an open mind, of course, is that people will insist on coming along and trying to put things in it.“
- Terry Pratchett
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:58 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