![]() |
Ich verstehe den Unterschied von Call-By-Reference .. nicht
Hi leute,
kann mir jemande bitte den Unterschied zwischen Call-By-Reference und Call-By-Value erklären? Das Delphibuch erklärt es so verwirrend, ich verstehe es nicht. Könnt ihr versuchen es einfach zu erklären, denn ich bin ja gerade dabei dies zu lernen und kenn mich nicht aus mit dynamische Arrays etc. Alles ist erstmal auf Funktionen bezogen: sprich function name(var blubb oder ohne var... Vielen Danke auf die Antworten |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Bei Call_By_Reference wird ein Zeiger auf die Variable übergeben, bei Call_By_Value ihren Wert.
|
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Zitat:
![]() ![]() |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Kannst du mir bitte ein Beispiel zeigen?
Verstehe das mit dem Zeiger nicht, denn ich verstehe unter einem Zeiger z.b. bei der Funktion Copy. Der Zeiger zeigt bei welchem Buchstaben es abgeschnittet werden muss... |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Delphi-Quellcode:
Siehst du den Unterschied?
prodedure AlsRef( var a: Integer);
begin inc(a); end; procedure AlsWert( a: integer); begin inc(a); end; .. a := 10; AlsWert( a); WriteLn(a); // Ausgabe 10 AlsRef( a); WriteLn( a); //Ausgabe 11 |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Zitat:
|
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
[ot]Was ist der Unterschied zwischen einem Hund?[/ot]
In meinem Delphibuch (Delphi für kids) wurde das mithilfe einer Funktion erklärt, die zwei Variablen vertauschen sollte.
Delphi-Quellcode:
Diese Funktion könntest du jetzt z.b. so testen:
procedure Exchange(x,y: integer);
var tmp: integer; begin tmp := y; // Wert von Y zwischenspeichern y := x; x := tmp; end;
Delphi-Quellcode:
Der Wert der Variablen wird also nur innerhlab von der Procedure Exchange verändert, weil sie mit Kopien der Variablen arbeitet. Das ganze ist so natürlich etwas witzlos, denn die Procedure soll ja die Variableninhalte austauschen.
var
a,b: integer; begin a := 5; b := 42; ShowMessage(Format('a:%d; b:%d',a,b)); // Gibt aus: a:5; b:42 Exchange(x,y); ShowMessage(Format('a:%d; b:%d',a,b)); // Gibt ebenfalls aus: a:5; b:42 end; Also schreiben wir das ganze etwas um:
Delphi-Quellcode:
Diesmal arbeitet die Funktion nicht mit einer lokalen Kopie sondern sozusagen "am lebenden Objekt", also direkt mit den Variablen, die wir als Parameter angegeben haben. Wenn du jetzt die Testprozedur nochmals ausführst, solltest du beim zweiten ShowMessage die vertauschten Werte bekommen.
procedure Exchange(var x,y: integer);
// ^-- Hierauf achten, bitte var tmp: integer; begin tmp := y; // Wert von Y zwischenspeichern y := x; x := tmp; end; @Kasten: ey... gemein, jetzt hab ich mir so viel Mühe gegeben |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Nein. In beiden Fällen hat das in der Prozedur den Wert 10 und wird dann auf 11 erhöht. Es war ein Fehler von mir die Variable genauso wie den Parameter zu nennen
Delphi-Quellcode:
Die lokale Variable x in AlsRef ist nun identisch mit mit a.
prodedure AlsRef( var x: Integer);
begin inc(x); end; procedure AlsWert( x: integer); begin inc(x); end; .. a := 10; AlsWert( a); WriteLn(a); // Ausgabe 10 AlsRef( a); WriteLn( a); //Ausgabe 11 Das inc() wirkt sich auf sie aus. |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
achso :P
Hab es jetzt verstanden danke! :dp: |
Re: Ich verstehe den Unterschied von Call-By-Reference .. ni
Zitat:
Änderst du nun in der Funktion einen Parameter, der mit call-by-referenz übergeben wurde, änderst du ihn direkt im Speicher. Die Änderung ist auch nach verlassen der Funktion gültig. Änderst du einen Parameter, der mit call-by-value übergeben wurde, arbeitet die Funktion mit dem Wert dieser Speicheradresse, den die Variable bezeichnet. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:03 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