Autor Beitrag
HenryHux
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 16:06 
Hi,
immoment habe ich ein Programm mit viele repeat-Schleifen und darin vielen verschiedenen, verschachtelten If-Abfragen.
Die Schleifen beende ich mit Variablen, also wenn der entsprechende If-Fall eingetreten ist, wird der Wert auf die Bedingung von Until gesetzt.
Jetzt wollte ich mal Fragen, geht das nicht einfacher?
Ich habe von break und goto gelesen.
break bringt mir aber nichts, weils nur eine Schleife beendet. (richtig verstanden?)
Womit kann ich eine ganze Schleife, mit mehreren kleineren beenden?

Lg

Henry
glotzer
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 393
Erhaltene Danke: 49

Win 7
Lazarus
BeitragVerfasst: Sa 02.10.10 16:08 
mit goto und Labels
mal in der helife nachlesen :p
bole
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 107
Erhaltene Danke: 15

win 10

BeitragVerfasst: Sa 02.10.10 16:17 
Ich würde Goto unbedingt vermeiden! Die macht den Code extrem unleserlich und unwartbar. Break ist zwar schon besser aber meines Erachtens auch ein verkapptes GOTO.

Ich denke du solltest Deine Schleifenkonstruktion überarbeiten, durch die Wahl der richtigen Schleife kann man dies meist stark vereinfachen.

_________________
ein programm macht nicht das was du willst sondern was du schreibst!
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 16:34 
Jo wollte ich auch immer, kannte es aus anderen Sprachen und fand es nie gut es zu benutzen.
Aber jetzt sind in einem Programm so verschatelte Schleifen, mit vielen If Abfragen, die nicht parallel eintreten können.
Dh wenn die erste If Anweisung zutrifft laufen die anderen Anweisungen auch weiter durch.
Einerseits sehr langsam und zweitens mir irgendwie nicht sicher.
Und break könnte ich bei ja auch nur so setzen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
 If ... then
         begin 
            anweisung1;
            anweisung2;
            break;
         end;

Und das bringt mir ja auch keine Verbesserung.. Deswegen goto.
Danke aber tortzdem =)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.10.10 16:44 
Wie wäre es denn mit else?
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 16:50 
Letztendlich hat das in repeat-Schleifen ja auch keinen Unterschied..
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.10.10 16:53 
Ich habe das darauf bezogen:
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Dh wenn die erste If Anweisung zutrifft laufen die anderen Anweisungen auch weiter durch.
Einerseits sehr langsam und zweitens mir irgendwie nicht sicher.
Das hörte sich so an:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if a then
begin
  xy;
end;
if b then
begin
  xy;
end;
Deshalb meinte ich das else, damit die zweite if-Abfrage nicht mehr ausgeführt wird.

Ja, ansonsten bleibt nur die Schleifenbedingungen gut zu setzen. ;-)

Und damit es nicht zu unübersichtlich wird, ist es natürlich sinnvoll manches in einzelne Methoden auszulagern.
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 17:00 
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if a then
begin
  xy;
end;
if b then
begin
  xy;
end;


Ist doch von der Geschwindigkeit und generell das gleiche wie
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
if a then
begin
  xy;
end;
else if b then
begin
  xy;
end;


Oder irre ich mich?
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Sa 02.10.10 17:09 
Schau Dir doch einfach dazu den Debugger Code an. Breakpoint setzen (F5), Anwendung starten und mit Strg+Alt+C in das CPU-Fenster wechseln.
Hier sieht man, dass im Falle eines else am Ende der Ausführung der ersten Bedingung ein JMP hinter die Zweite gesetzt wird. ;) Somit ist dies u.U. schneller.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
Unit1.pas.33if (s = 'a') then
00466568 8B45FC           mov eax,[ebp-$04]
0046656B BAB8654600       mov edx,$004665b8
00466570 E8BBF6F9FF       call @UStrEqual
00466575 7503             jnz $0046657a // Else
Unit1.pas.35: nop
00466577 90               nop // Die Befehlsätze innerhalb des ersten IFs; in diesem Fall nur "nop" (no process)
00466578 EB10             jmp $0046658a // JMP hinter die zweite Abfrage *
Unit1.pas.38if (s = 'b') then
00466578B45FC           mov eax,[ebp-$04]
0046657D BAC8654600       mov edx,$004665c8
00466582 E8A9F6F9FF       call @UStrEqual
00466587 7501             jnz $0046658a
Unit1.pas.40: nop
00466589 90               nop // Befehl im zweiten IF
Unit1.pas.42: end; 
004665833C0             xor eax,eax // *


Zuletzt bearbeitet von Marc. am Sa 02.10.10 18:47, insgesamt 1-mal bearbeitet
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 17:22 
Ok.
Immoment habe ich einfach alle If-Anweisungen ganz normal verschachtelt und hintereinander geschrieben.
Sollte ich generell lieber mit else arbeiten?
platzwart
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 1054
Erhaltene Danke: 78

Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
BeitragVerfasst: Sa 02.10.10 17:36 
Kannst du mal den realen Code posten? Dann könnte man sicherlich besser helfen...

_________________
Wissenschaft schafft Wissenschaft, denn Wissenschaft ist Wissenschaft, die mit Wissen und Schaffen Wissen schafft. (myself)
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 17:45 
In der einen procedure wo meine Frage drüber war sind mehr als 2k Zeilen drin.
Denke nicht gerade die beste Idee das hier zu posten =)
Aber meine Frage hat sich schon geklärt.
Habe die "parallelen" Ifs mit else if gemacht.
So wie ich das verstanden hab, werden sobald davon eine richtig ist, die danachstehenden Ifs alle nicht mehr abgefragt.
Tilman
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1405
Erhaltene Danke: 51

Win 7, Android
Turbo Delphi, Eclipse
BeitragVerfasst: Sa 02.10.10 17:47 
Eventuell könnte auch case das richtige für dich sein. Btw: wenn eine Prozedur > als 2000 Zeilen Code hat, dann läuft irgendwas falsch ;) du solltest dann Codeteile in weitere prozeduren auslagern, und schauen ob du Code "wiederverwenden" kannst, also vielleicht in vielen Zeilen immer fast das selbe machst.

_________________
Bringe einen Menschen zum grübeln, dann kannst du heimlich seinen Reis essen.
(Koreanisches Sprichwort)
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 17:56 
Case ist If, quasi mit oder, richtig? :D
Das wäre auch nicht gut, denn es sind viele verschiedene Aktionen in verschiedenen Situationen.
Das einzige was mir noch zu schaffen macht, ist die until Bedingung, die ich dann bei jedem If auf 0 setzen muss.
Ansonsten ist der Code schon fast maximal in anderen Funktionen bzw. Prodzeduren ausgelagert.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.10.10 18:06 
Wenn du else nutzt, dann wird der Teil im else nur ausgeführt, wenn die erste if-Abfrage nicht wahr war. Also genau was du willst.

Und zu den 2000 Zeilen wurde ja schon etwas gesagt:
Das ist dein größtes Problem... Also 200-300 Zeilen ist schon viel, aber das kann schon mal passieren. Aber 2000, in Worten zweitausend, Zeilen?!?

Da solltest du dringend deine Codestruktur korrigieren, dann lösen sich die anderen Probleme vermutlich von selbst...
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 18:18 
Is mein erstes wirklich größeres Programm, das ich schreibe.
Nun schon fast seit einem Monat.
Aber dachte, das wäre völlig normal mal in einer Procedure ein bisschen mehr stehen zu aheb :D
Aber ich wüsste ernsthaft nicht, wie ich den Code noch viel mehr auslagern sollte.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.10.10 18:24 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Aber ich wüsste ernsthaft nicht, wie ich den Code noch viel mehr auslagern sollte.
Wenn du eine einigermaßen neue Version von Delphi hast, macht Delphi das automatisch für dich. Nicht unbedingt schön, ich mache es meistens lieber manuell, aber es funktioniert.

Dafür markierst du den Teil, der ausgelagert werden soll, und gehst unter Refactoring auf Methode extrahieren.

Es gibt jedenfalls bestimmt Möglichkeiten zur Auslagerung. Du musst immer schauen was du logisch in kleine Stücke teilen kannst und das dann in eigene Prozeduren packen. So kannst du nebenbei solche Codeteile dann auch viel besser wiederverwenden.
HenryHux Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 542
Erhaltene Danke: 33

Windows 7 Premium
Delphi XE, Eclipse
BeitragVerfasst: Sa 02.10.10 18:37 
Ok, danke für den Tipp, wusst ich nicht, werds gleich mal ausprobieren.
Habe jetzt mal alles mit GoTo bearbeitet.
Sind nur 2 Labels, weiß aber nicht ob das die beste Idee war.
Natürlich springt er sofort woanders hin, aber was mich stört, ist dass Labels anscheinend nur Lokal zu deklarieren sind.
D.h wenn ich per GoTo in einer andere Procedur springen will, geht das nicht direkt.
Habe jetzt am Schluss der Prozedur, wo ich rausspringen will, eine praktisch unerfüllbar If-Anweisung gesetzt, wo ich das Label rein positioniert habe.
Vor dem letzten Ende kommt dann nur noch mal der Verweis auf die andere Prozedur, dürfte also funktionieren.
Was haltet ihr davon?
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: Sa 02.10.10 18:41 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Ok, danke für den Tipp, wusst ich nicht, werds gleich mal ausprobieren.
Habe jetzt mal alles mit GoTo bearbeitet.
Sind nur 2 Labels, weiß aber nicht ob das die beste Idee war.
Natürlich springt er sofort woanders hin, aber was mich stört, ist dass Labels anscheinend nur Lokal zu deklarieren sind.
D.h wenn ich per GoTo in einer andere Procedur springen will, geht das nicht direkt.
Habe jetzt am Schluss der Prozedur, wo ich rausspringen will, eine praktisch unerfüllbar If-Anweisung gesetzt, wo ich das Label rein positioniert habe.
Vor dem letzten Ende kommt dann nur noch mal der Verweis auf die andere Prozedur, dürfte also funktionieren.
Was haltet ihr davon?


ja, keine schlechte idee wenn man Programmierer in der Herzinfakt- oder Selbstmordtot treiben will. Für ernstes Programmieren sind aber GoTos n absolutes No-Go. ;)

lg elundril

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

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 02.10.10 18:42 
user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Natürlich springt er sofort woanders hin, aber was mich stört, ist dass Labels anscheinend nur Lokal zu deklarieren sind.
D.h wenn ich per GoTo in einer andere Procedur springen will, geht das nicht direkt.
Das wäre ja der Super-GAU. Schlimm genug, dass es goto überhaupt gibt. Die Anwendungsfälle, in denen das wirklich sinnvoll ist kann man quasi an einer Hand abzählen. Dein Programm gehört zu 99,999% sicher nicht dazu...

user profile iconHenryHux hat folgendes geschrieben Zum zitierten Posting springen:
Was haltet ihr davon?
Nichts, mach es besser richtig statt solche Notkonstrukte zu basteln...