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=0) then 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
Narses: 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
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
elundril hat folgendes geschrieben : |
| 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
iKilledKenny hat folgendes geschrieben : |
| 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
jaenicke hat folgendes geschrieben : |
iKilledKenny hat folgendes geschrieben : | | 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
FinnO hat folgendes geschrieben : |
| 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
elundril hat folgendes geschrieben : |
| 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 ^^
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!