Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Unterschied Function und Procedure !
Jagg - Sa 27.09.03 15:40
Titel: Unterschied Function und Procedure !
Hallo Leute !
Was ist eingentlich der Unterschied zwischen einer Function und einer Procedure ?
Ich habe gehört,es gibt call by value und call by refeference,was ist das ?
Könnt ihr mir auch Beispiele geben ?
Jagg !
UC-Chewie - Sa 27.09.03 15:52
Unterschied zwischen Prozedur und Funktion:
Bei der Funktion wird ein Wert zurückgegeben (nach Abarbeitung der Befehle ist der Wert in EAX relevant)
Bei der Prozeedur wird kein Wert zurückgegeben (Wert in EAX irrelevant).
Call by Value
Beim Übergeben eines Parameters an eine Funktion/Prozedur werden alle Daten, die die Varaible belegt, in den Adressraum der Funktion/Prozedur kopiert.
Das passiert, wenn eine Variable ohne zusätztliche Schlüsselwörter an eine Funktion/Prozedur übergeben wird.
Call by Reference
Anstatt den belegten Speicher zu kopieren, wird lediglich ein Zeiger auf diesen Speicherbereich an die Funktion/Prozedur übergeben. Innerhalb der Funktion kann dann auf diesen Speicherbereich zugegriffen werden.
Es wird unterschieden zwischen dem übergeben von Argumenten perr const und var-Parameter: Bei const darf nur lesend zugegriffen werden, bei var darf schreibend zugegriffen werden, die Originaldaten werden in diesem Fall verändert.
Christian S. - Sa 27.09.03 15:53
Hallo!
Der Unterschied zwischen einer Prozedur und einer Funktion ist ganz einfach: eine Funktion gibt einen Wert zurück, nachdem sie ihren Code durchlaufen hat und eine Prozedur tut dies nicht.
Ein Beispiel:
Delphi-Quelltext
1: 2: 3: 4:
| function multiply (a,b : INTEGER) : INTEGER; begin result := a*b; end; |
Diese Funktion multipliziert die Parameter a und b und gibt das Ergebnis zurück. Die kann man so benutzen:
Delphi-Quelltext
1: 2: 3: 4:
| VAR a,b,c : INTEGER; begin c := multiply(a,b); end; |
Mit einer Prozedur geht das nicht, da diese keinen Wert zurück gibt (der letzte ": INTEGER" fehlt sozusagen).
Call-by-Value und Call-by-Reference bezieht sich auf die Parameter, welche eine Funktion oder Prozedur erhält. Du kannst entweder den Wert übergeben (also z.B. 5) oder Du kannst die Variable (also z.B. a : INTEGER). Der Unterschied: wenn Du bei letzterem in der Funktion / Prozedur auf die übergebene Variable zugreift, so hat das auch Auswirkungen auf den Wert der Variable in dem Programmteil, welcher die Funktion / Prozedur aufgerufen hat.
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure nummer1(a, b : INTEGER; VAR c: Integer); begin c := a*b; end;
procedure TForm1.Button1Click(Sender: TObject); VAR c : INTEGER; begin nummer1(3,5,c); label1.caption := IntToStr(c); end; |
Nach dem Aufruf von nummer1 hat die Variable c
in Button1Click den Wert 15. Heißt: durch die Operation in nummer1 hat sich die Variable auch in Button1Click geändert - Call-by-Reference.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure nummer2(a,b : INTEGER; c : INTEGER); begin c:= a*b; end;
procedure TForm1.Button1Click(Sender: TObject); VAR c : INTEGER; begin nummer2(3,5,c); label1.caption := IntToStr(c); end; |
Nach dem Aufruf von nummer2 hat die Variable c in Button1Click immer noch den gleichen (undefinierten da nicht initialisierten) Wert - Call-By-Value.
So, ich hoffe, ich konnte Dir etwas helfen.
MfG
peter
//edit: mist, zu langsam
Jagg - Sa 27.09.03 15:54
aha,danke und kann's du mir auch mal 2 Beispiele dafür geben um mir mal den Unterschied zu verdeutlichen !
Ehrlich gesagt kann ich damit nichts anfangen !
DaClown - Sa 27.09.03 18:17
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| function aendere_text(text:string):string; begin
result := text +'a';
end; |
hier wird text mit einem a hintendran zurück gegeben und man kann die function wie sin() oder so benutzen also
Delphi-Quelltext
1: 2: 3: 4: 5:
| .. var temp:string; begin
temp := aendere_text('Hallo'); |
in temp steht dann 'Halloa' drin ...
Um sowas mit ner Prozedur zu machen müsstest du wohl ne globale Variable deklarieren oder nen Zeiger benutzen damit das gleiche passiert
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!