photor hat geschrieben:braunbär hat geschrieben:Das kannst du auch, wenn du statt Result den Funktionsnamen verwendest.
Aber so kannst du sogar schreiben:
Code: Alles auswählen
function Factor1(blah1 : double; blub2 : integer) : double;
begin
Result := 1.0;
if x <= 1.0 then
Result := Result+1;
end;
Das ginge mit der Funktionsnamen-Variante nicht? Das klingt nach einem handfesten Vorteil (ob's immer gut ist, ist ne andere Frage).
Ich wüsste nicht, was daran schlecht sein könnte.
Mit der Funktionsname-Variante geht es deshalb nicht, weil der Funktionsname auf der rechten Seite einer Zuweisung immer den Aufruf der Funktion bedeutet, auch im Funktionsrumpf selbst:
Code: Alles auswählen
function faktorielle (n: integer): integer;
begin
if n<2
then result:=1
else result:=n*faktorielle(n-1);
end
Du kannst auch schreiben:
Code: Alles auswählen
function faktorielle (n: integer): integer;
begin
if n<2
then faktorielle := 1
else faktorielle := n*faktorielle(n-1);
end
Aber an dem Beispiel siehst du sehr gut, warum die Verwendung von Result besser ist.
Steht Faktorielle links, dann wird ein Funktionsergebnis zugewiesen, steht es aber rechts vom Zuweisungsoperator, dann bedeutet es einen neuen (rekursiven) Funktionsaufruf. Das ist zwar nicht mißverständlich, weil es klar definiert ist, aber die Verwendung von Result macht das Programm meines Erachtens besser lesbar.
photor hat geschrieben:
Und result[\i] ist automatisch von deklarierten Typ der Funktion, und es sind auch nur die generischen Typen (keine Objekte oder Records - allenfalls Pointer darauf) möglich, nehme ich an.
Nein, warum sollte es so eine Einschränkung geben? Result ist vom Typ der deklarierten Funktion, das kann jeder Typ sein, den eine Funktion haben kann.