Dämliche Frage zur Rekursion

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Dämliche Frage zur Rekursion

Beitrag von Joz »

Hallo,
Hab da mal eine ganz dümmliche Frage:
Ich hatte eine etwas kompliziertere Funktion mit bedingtem Selbstaufruf, die nicht funktionierte. In der Folge habe ich diese Funktion auf den Selbstaufruf reduziert und gemerkt, dass sie nur einmal aufgerufen wird. Der folgende Code zeigt bei mir genau eine Meldung an:

Code: Alles auswählen

function GetSomething: string;
begin
  ShowMessage('Aufruf');
  Result := GetSomething;
end;
Woran liegt das? Wenn ich nicht gerade ziemlich blind bin, müsste ich doch unendlich viele Male eine Meldungsbox bekommen, oder?
Auch wenn ich die Zeile als Haltepunkt markiere, wird sie nur einmal aufgerufen. Ich hoffe, dass ich nicht gerade einen kollossal peinlichen Denkfehler begehe.
Kleiner Funfact: Deklare ich die Funktion als Prozedur und schreibe statt "Result :=" nur "GetSomething", ruft sie sich selbst auf. Sonst nicht.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Dämliche Frage zur Rekursion

Beitrag von Socke »

Joz hat geschrieben:Woran liegt das? Wenn ich nicht gerade ziemlich blind bin, müsste ich doch unendlich viele Male eine Meldungsbox bekommen, oder?
Auch wenn ich die Zeile als Haltepunkt markiere, wird sie nur einmal aufgerufen. Ich hoffe, dass ich nicht gerade einen kollossal peinlichen Denkfehler begehe.
Kleiner Funfact: Deklare ich die Funktion als Prozedur und schreibe statt "Result :=" nur "GetSomething", ruft sie sich selbst auf. Sonst nicht.
Der Free Pascal Compiler optimiert deinen Funktionsaufruf einfach weg.

Es gibt zwar keinen Grund dafür, aber du kannst den Compiler überlisten:

Code: Alles auswählen

 
function GetSomething: String;
begin
  showMessage('Aufruf');
  GetSomething();
  Result := 'Hallo';
end;
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10899
Registriert: Mo 11. Sep 2006, 19:01

Re: Dämliche Frage zur Rekursion

Beitrag von theo »

In deinem Fall ist "GetSomething" das gleiche wie "Result".

Code: Alles auswählen

 function GetSomething: string;
begin
   GetSomething:='eins';
   ShowMessage(Result);
   ShowMessage(GetSomething);
end;   
GetSomething(); ruft die Proc. auf.

Joz
Beiträge: 40
Registriert: Mo 27. Mai 2013, 13:16
OS, Lazarus, FPC: Arch Linux, OpenSuse 13.2, Lazarus 1.4
CPU-Target: AMD64
Wohnort: Berlin

Re: Dämliche Frage zur Rekursion

Beitrag von Joz »

Danke, das mit dem geklammerten Aufruf hat geklappt.
Hatte wohl vergessen, dass Delphi nicht die einzige Umgebung ist, mit der FPC kompatibel sein soll.

Antworten