Exit in Funktion

Für Fragen von Einsteigern und Programmieranfängern...
wennerer
Beiträge: 352
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_
CPU-Target: x86_64-linux-gtk2

Exit in Funktion

Beitrag von wennerer »

Hallo,
ich habe im Internationalen Forum folgenden Code gesehen:

Code: Alles auswählen

function TPropGridFileNamePropertyEditor.GetAttributes: TPropertyAttributes;
begin
  Exit([paDialog, paRevertable, paReadOnly]);
end;
Ich habe da eigentlich ein "Result:=" erwartet, ein exit() hab ich noch nie gesehen. Kann mir jemand erklären was da passiert?

Viele Grüße
Bernd

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

Re: Exit in Funktion

Beitrag von theo »

In diesem Falle kommt es wohl auf dasselbe heraus.

Sonst ist es wohl eine Abkürzung für

Code: Alles auswählen

Result:=x;
Exit;
https://www.freepascal.org/docs-html/rt ... /exit.html

wennerer
Beiträge: 352
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_
CPU-Target: x86_64-linux-gtk2

Re: Exit in Funktion

Beitrag von wennerer »

Hallo Theo,
herzlichen Dank. Kannte ich bis jetzt nicht.

Viele Grüße
Bernd

Benutzeravatar
Winni
Beiträge: 1091
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Exit in Funktion

Beitrag von Winni »

Hi!

Turbo Pascal konnte nur pures exit ohne Parameter.

Exit mit Funktions-Rückgabewert gibt's meines Wissen seit Delphi 1.

Obiges Beispiel scheint aber von einem C-Umsteiger zu sein, der eine zweite Zeile und leserlichen Code nicht ertragen kann ....

Winni

wennerer
Beiträge: 352
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon, Lazarus Stable 2.2.0 (rev lazarus_2_2_0) FPC 3.2.2 x86_
CPU-Target: x86_64-linux-gtk2

Re: Exit in Funktion

Beitrag von wennerer »

Exit mit Funktions-Rückgabewert gibt's meines Wissen seit Delphi 1.
Na ja ist wohl irgendwie an mir vorbei gegangen. Ich hab es aber auch nicht vermisst :D

Viele Grüße
Bernd

wp_xyz
Beiträge: 4092
Registriert: Fr 8. Apr 2011, 09:01

Re: Exit in Funktion

Beitrag von wp_xyz »

wennerer hat geschrieben:
Mo 20. Dez 2021, 17:23
Exit mit Funktions-Rückgabewert gibt's meines Wissen seit Delphi 1.
Na ja ist wohl irgendwie an mir vorbei gegangen.
An mir auch. Allerdings war ich die meiste Zeit mit Delphi 7 aktiv, und da gab es "exit(xxx)" definitiv noch nicht. Gerade getestet:

Code: Alles auswählen

function Test(a: Integer): String;
begin
  if a > 0 then
    exit('> 0')
  else
    exit('<= 0');
end;
Delphi 7 meldet hier nach der öffnenden Klammer von "exit" den Fehler: "Operator oder Semikolon fehlt". Bei Delphi XE2, der nächsten Version, zu der ich Zugang hatte, kompiliert das Beispiel dagegen einwandfrei.

Warf
Beiträge: 1598
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Exit in Funktion

Beitrag von Warf »

Winni hat geschrieben:
Mo 20. Dez 2021, 16:51
Obiges Beispiel scheint aber von einem C-Umsteiger zu sein, der eine zweite Zeile und leserlichen Code nicht ertragen kann ....
Es ist schon sehr nützlich wenn man dem break fast break even prinzip folgen will, und sehr viel code der form:

Code: Alles auswählen

if condition then
  Exit(ErrorCode);
hat. Die alternative:

Code: Alles auswählen

if condition then
begin
  Result := ErrorCode;
  Exit;
end;
ist einfach mehr als doppelt so lang und ist damit nicht nur mehr aufwand zu schreiben, sondern weil du auch effektiv mehr code brauchst um die selbe menge an Information zu vermitteln, schlicht weg schwerer zu lesen.
Zuletzt geändert von Warf am Mo 20. Dez 2021, 18:11, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1091
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Exit in Funktion

Beitrag von Winni »

Hi!

Ne, mein Irrtum.

Der Fortschritt bei Delphi 1 war, dass man wenn man mit exit verließ. einen Rückgabewert des Programms setzen konnte:

Code: Alles auswählen

begin
....
exit (234);
end.
Winni

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1013
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Winux (L 2.0.11 FPC 3.2)
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: Exit in Funktion

Beitrag von fliegermichl »

So richtig sauberer Stil ist das mit exit aber nicht (Mit oder ohne Rückgabe)
Das ist so wie mit Label und goto, die man zwar verwenden kann aber nicht sollte.

Warf
Beiträge: 1598
Registriert: Di 23. Sep 2014, 17:46
OS, Lazarus, FPC: Win10 | Linux
CPU-Target: x86_64

Re: Exit in Funktion

Beitrag von Warf »

fliegermichl hat geschrieben:
Mo 20. Dez 2021, 20:27
So richtig sauberer Stil ist das mit exit aber nicht (Mit oder ohne Rückgabe)
Das ist so wie mit Label und goto, die man zwar verwenden kann aber nicht sollte.
Da muss icj ganz klar widersprechen. Der grund warum goto als schlechter stil gilt ist nicht weil man damit einen jump macht, sondern weil goto zusätzliche Komplexität einführt
Ein while loop ist auch nichts anderes als ein verstecktes goto, aber ich denk niemand, ausser vielleicht ein paar hardcore haskell fans, würden while loops als schlechten stil bezeichnen. Der grund ist weil goto hat keine feste struktur und regelung. du kannst also von überall nach überall springen, den code rauf und runter wie du willst. While auf der anderen seite hat eine feste struktur und klar definierte sprung regeln.
Genauso ists mit Exit. Da ein Exit eine fest definierte struktur und sprung punkte hat, immer zum ende der funktion, ist das nicht mit goto vergleichbar.

Und es gibt viele Situationen in denen Exit sehr viel sinn macht, z.b.

Code: Alles auswählen

while condition1 do
begin
  // code
  if errorcondition then
    Exit(ErrorCode);
  // code
end;
// code
Result := ...
Ohne exit wäre das

Code: Alles auswählen

while not failure and condition1 do
begin
  // code
  if errorcondition then
  begin
    Result := ErrorCode;
    Failure := True;
  end
  else
  begin
    // code
  end;
end;
if Not Failure then
begin
  // code
  Result := ...
End;
Nicht exit zu benutzen erhöt die komplexität des codes massiv, da eine neue variable ein eöse und ein if block eingeführt werden muss.
Die idee hinter sauberem coding stil ist es die komplexität so gering wie möglich zu halten und dementsprechend führt in diesem Fall die Verwendung von Exit zu saubereren Code.

Benutzeravatar
Winni
Beiträge: 1091
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Exit in Funktion

Beitrag von Winni »

Hi!

Jo, mit exit kann man code schnell und einfach deutlich reduzieren.

Ein Beispiel aus der Praxis - aus meinem uralten Tetris-clone:

Code: Alles auswählen

function allowed (newX,newY : Integer) : boolean;
 var xx,yy: integer;
begin
result := false;
  for xx := 0 to 3 do
      for yy := 0 to 3 do
         if tet[xx,yy] then
              if field[xx+newX,yy+newY] <> clWhite then exit;
   result := true;
end;  

Winni

Benutzeravatar
six1
Beiträge: 558
Registriert: Do 1. Jul 2010, 19:01

Re: Exit in Funktion

Beitrag von six1 »

Ich verwende exit oft im VirtualDrawTree als allererste Zeile bei Mouse Events.

if node=nil then exit;

klar, man könnte auch schreiben:
if node<>nil then
begin
end;

Exit finde ich eleganter.
Gruß, Michael

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

Re: Exit in Funktion

Beitrag von theo »

Wieder mal ein Thread, wo jeder seinen Senf abliefert, obwohl schon längst off-topic. :mrgreen:

Dann gebe ich meinen auch noch dazu.
Wenn man in "begin...end"-Blöcken denkt, kann ein verstecktes "exit" schon ein wenig kryptisch sein, bzw. man kann es in der Analyse des Programmflusses übersehen.

Ich benutze es auch manchmal, aber ich überlege mir jeweils dreimal, ob es mich nicht später in den Hintern treten könnte.
Stolz bin ich nie darauf.

Benutzeravatar
Winni
Beiträge: 1091
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.0.12, fpc 3.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Exit in Funktion

Beitrag von Winni »

Hi!

Na, dann noch mal ein bischen Senf zur Geschichte von exit

* In der ersten Definition von N. Wirth gab es keine exit in Pascal

* Exit wurde von UCSD-Pascal eingeführt und zwar
a) ohne Parameter - wie später Turbo Pascal
b) mit der Angabe der Routine, aus der rausgesprungen werden sollte.

Das hatte den Vorteil, dass auch aus geschachtelten Routinen aus der rufenden rausgesprungen werden konnte:

Code: Alles auswählen

procdure  abc;

     procedure def;
     begin
     ....
     exit (abc);
     end;

begin // abc
....
def;
end;

Das war recht praktisch.
Tauchte aber nur bei UCSD und später bei SVS-Pascal auf.

Wurde sowohl von Turbo-Pascal als auch von Delphi / fpc verworfen.

Das war die Rubrik "Opa erzählt vom letzten Jahrtausend" von

Winni

Benutzeravatar
six1
Beiträge: 558
Registriert: Do 1. Jul 2010, 19:01

Re: Exit in Funktion

Beitrag von six1 »

Da es ja nun mal da ist: Darf ich es trotzdem verwenden Winni? :lol:
Gruß, Michael

Antworten