Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Bei if immer else??


anx - Fr 04.12.09 13:24
Titel: Bei if immer else??
Hallo zusammen,
ich wollte gerade folgende Funktion schreiben:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function pot(bas,poz:integer):integer;
begin
 if(poz=0then
  result:=1;
 result:=pot(bas,poz-1)*bas;
end;


Das funktioniert aber nicht, da es zu einem StackOverflow kommt. Ich bin von Haus aus C++ler und war darüber sehr verwundert. Nun habe ich erfahren, dass ich auf jeden Fall nach "result:=1" else schreiben muss. Warum?? Ist das in Delphi Pflicht? Wird bei result die Funktion nicht beendet, sondern wird auch noch der Rest durchgeführt? Das ist in C++ anders!!!

Vielen Dank
lg, anx


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Fr 04.12.2009 um 18:52


elundril - Fr 04.12.09 13:29

nein, bei result wird die function nicht beendet. Result ist in Delphi eine ganz normale Variable und die function wird im normalfall bis zum ende abgearbeitet, deswegen musst dein result := pot(bas, poz-1)*bas; in einen else-Zweig auslagern.

Aber prinzipiell ist es nicht Pflicht ein else zu schreiben. Bei diesem Konstrukt wäre zb ein else sinnlos:


Delphi-Quelltext
1:
2:
  if x=3 then
    Showmessage('x ist 3');


lg elundril


anx - Fr 04.12.09 13:32

Achso...das wusste ich nicht! Aber wie beende ich denn dann eine Prozedur? Ich C++ schreibe ich einfach "return", doch das funktioniert hier ja nicht.

außerdem. Wenn ich bei einer for Schleife "to 5" schreibe, ist es dann inklusive oder exklusive 5?

Vielen Dank
lg, anx


iKilledKenny - Fr 04.12.09 13:39

Eine Routine wird mit

Delphi-Quelltext
1:
Exit;                    

verlassen.
Ja, bei

Delphi-Quelltext
1:
2:
for i := 0 to 5 do
  DoSomething (i);

ist die 5 mit dabei.


anx - Fr 04.12.09 13:42

Ok, oh...man! Ich bevorzuge C++, aber hätte ich mit Delphi angefangen, dann wäre es wohl genau andersherum!

Vielene Dank euch beiden!

lg, anx


elundril - Fr 04.12.09 13:42

wenn du exit verwendest musst du das aber mit in den then-zweig packen. außerdem is exit nicht gerade schöner programmierstil und sollte vermieden werden. in diesem fall kann er sogar elegant und zeitunaufwändig vermieden werden!

btw: pro frage ein Topic aufmachen ;)

lg elundril


iKilledKenny - Fr 04.12.09 13:53

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
außerdem is exit nicht gerade schöner programmierstil und sollte vermieden werden.


Da kann man ja trefflich drüber streiten. Ich denke, in vielen Fällen erhöht Exit einfach die Übersichtlichkeit in großen Routinen.


jaenicke - Fr 04.12.09 14:01

user profile iconiKilledKenny hat folgendes geschrieben Zum zitierten Posting springen:
Ich denke, in vielen Fällen erhöht Exit einfach die Übersichtlichkeit in großen Routinen.
Der Fehler liegt woanders, siehe Markierung. :mrgreen:

Wenn man übersichtliche modulare Routinen schreibt, dann ist es gar nicht so wichtig ob man Exit benutzt oder nicht, da es so oder so übersichtlich bleibt. Wenn man so viele Zeilen in einer Routine hat, dass es unübersichtlich wird, dann hat man meistens (von Ausnahmefällen einmal abgesehen, manchmal gehts kaum anders) etwas falsch gemacht.


iKilledKenny - Fr 04.12.09 14:22

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconiKilledKenny hat folgendes geschrieben Zum zitierten Posting springen:
Ich denke, in vielen Fällen erhöht Exit einfach die Übersichtlichkeit in großen Routinen.
Der Fehler liegt woanders, siehe Markierung. :mrgreen:


Da gebe ich dir recht, ich meine aber sowas in groß, was Threadersteller ganz oben begonnen hat.
Anstelle von

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
if (AString = 'A'then
  begin
  end
else
  if (AString = 'B'then
    begin
    end
  else
    if (AString = 'C'then
      begin
      end
    else
      ...

ist sowas viel übersichtlicher:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
if (AString = 'A'then
  begin
    ...
    Exit;
  end;
if (AString = 'B'then
  begin
    ...
    Exit;
  end;
if (AString = 'C'then
  begin
    ...
    Exit;
  end;


Das hängt auch damit zusammen, dass ich eine maximale Zeichenanzahl von 80 pro Zeile habe...

Nichtsdestotrotz habe ich schon beim Absenden des letzten Postings gemerkt, dass das wieder eine Grundsatzdiskussion werden könnte... :beer:


FinnO - Fr 04.12.09 15:45

kann man nicht exit mit parameter wie return benutzen :???:


jaenicke - Fr 04.12.09 16:21

user profile iconFinnO hat folgendes geschrieben Zum zitierten Posting springen:
kann man nicht exit mit parameter wie return benutzen :???:
Ab Delphi 2009 ja, da mache ich das auch, aber in Delphi 2007 und früher ging das noch nicht. ;-)


elundril - Fr 04.12.09 21:21

hatte ich nun recht oder hab ich *mist*e erzählt? :gruebel:

lg elundril


BenBE - Fr 04.12.09 22:12

Bei sowas entweder Case Of oder Else If verwenden. Wobei der Fehler wie gesagt die Erstellung großer Routinen überhaupt ist ;-)


jaenicke - Fr 04.12.09 22:17

user profile iconelundril hat folgendes geschrieben Zum zitierten Posting springen:
hatte ich nun recht oder hab ich *mist*e erzählt? :gruebel:
Ab Delphi 2009 funktioniert das z.B. so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function pot(bas, poz: integer): integer;
begin
  if poz = 0 then
    Exit(1);
  Exit(pot(bas, poz - 1) * bas);
end;
Aber ich finde das eher schlecht zu überblicken.

Dennoch gibt es auch Fälle, in denen andere Wege umständlicher wären, an denen ich Exit gerne so nutze. (Es war allerdings schon etwas gewöhnungsbedürftig. :mrgreen: )


BenBE - Fr 04.12.09 22:29

Naja, hätten sie's wenigstens Return genannt ;-) ... Dann wär das wenigstens halbwegs C-Kompatibel ^^