Autor Beitrag
anx
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: Fr 04.12.09 13:24 
Hallo zusammen,
ich wollte gerade folgende Funktion schreiben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: Fr 04.12.09 13:39 
Eine Routine wird mit
ausblenden Delphi-Quelltext
1:
Exit;					

verlassen.
Ja, bei
ausblenden Delphi-Quelltext
1:
2:
for i := 0 to 5 do
  DoSomething (i);

ist die 5 mit dabei.
anx Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 16



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 394
Erhaltene Danke: 8

Win XP
D5 Prof, C# Express 2005
BeitragVerfasst: 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
ausblenden 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1331
Erhaltene Danke: 123

Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
BeitragVerfasst: Fr 04.12.09 15:45 
kann man nicht exit mit parameter wie return benutzen :???:
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Fr 04.12.09 21:21 
hatte ich nun recht oder hab ich *mist*e erzählt? :gruebel:

lg elundril

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.