Autor Beitrag
Jagg
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: Sa 27.09.03 15:40 
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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 531

WinXP
D5 Ent
BeitragVerfasst: 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.

_________________
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: 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:
ausblenden 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:
ausblenden 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:

ausblenden 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.

ausblenden 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

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".


Zuletzt bearbeitet von Christian S. am Sa 27.09.03 15:54, insgesamt 1-mal bearbeitet
Jagg Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 635



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 68



BeitragVerfasst: Sa 27.09.03 18:17 
ausblenden 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

ausblenden 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