| Autor |
Beitrag |
anx
      
Beiträge: 16
|
Verfasst: Fr 04.12.09 13:24
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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
anx 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Fr 04.12.09 13:39
Eine Routine wird mit
Delphi-Quelltext
verlassen.
Ja, bei
Delphi-Quelltext 1: 2:
| for i := 0 to 5 do DoSomething (i); |
ist die 5 mit dabei.
|
|
anx 
      
Beiträge: 16
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: 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
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
iKilledKenny
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: 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
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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.
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
      
Beiträge: 394
Erhaltene Danke: 8
Win XP
D5 Prof, C# Express 2005
|
Verfasst: Fr 04.12.09 14:22
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Fr 04.12.09 15:45
kann man nicht exit mit parameter wie return benutzen 
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.12.09 16:21
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Fr 04.12.09 21:21
hatte ich nun recht oder hab ich *mist*e erzählt?
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 04.12.09 22:17
elundril hat folgendes geschrieben : | hatte ich nun recht oder hab ich *mist*e erzählt? |
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.  )
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 04.12.09 22:29
Naja, hätten sie's wenigstens Return genannt  ... Dann wär das wenigstens halbwegs C-Kompatibel ^^
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|