Autor |
Beitrag |
HenryHux
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 393
Erhaltene Danke: 49
Win 7
Lazarus
|
Verfasst: Sa 02.10.10 16:08
mit goto und Labels
mal in der helife nachlesen :p
|
|
bole
      
Beiträge: 107
Erhaltene Danke: 15
win 10
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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:
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 02.10.10 16:44
Wie wäre es denn mit else?
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Sa 02.10.10 16:50
Letztendlich hat das in repeat-Schleifen ja auch keinen Unterschied..
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 02.10.10 16:53
Ich habe das darauf bezogen: HenryHux hat folgendes geschrieben : | 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: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Sa 02.10.10 17:00
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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.
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| Unit1.pas.33: if (s = 'a') then 00466568 8B45FC mov eax,[ebp-$04] 0046656B BAB8654600 mov edx,$004665b8 00466570 E8BBF6F9FF call @UStrEqual 00466575 7503 jnz $0046657a Unit1.pas.35: nop 00466577 90 nop 00466578 EB10 jmp $0046658a Unit1.pas.38: if (s = 'b') then 0046657A 8B45FC mov eax,[ebp-$04] 0046657D BAC8654600 mov edx,$004665c8 00466582 E8A9F6F9FF call @UStrEqual 00466587 7501 jnz $0046658a Unit1.pas.40: nop 00466589 90 nop Unit1.pas.42: end; 0046658A 33C0 xor eax,eax |
Zuletzt bearbeitet von Marc. am Sa 02.10.10 18:47, insgesamt 1-mal bearbeitet
|
|
HenryHux 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 1054
Erhaltene Danke: 78
Win 7, Ubuntu 9.10
Delphi 2007 Pro, C++, Qt
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 1405
Erhaltene Danke: 51
Win 7, Android
Turbo Delphi, Eclipse
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: Sa 02.10.10 17:56
Case ist If, quasi mit oder, richtig?
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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
Aber ich wüsste ernsthaft nicht, wie ich den Code noch viel mehr auslagern sollte.
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 02.10.10 18:24
HenryHux hat folgendes geschrieben : | 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 
      
Beiträge: 542
Erhaltene Danke: 33
Windows 7 Premium
Delphi XE, Eclipse
|
Verfasst: 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
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Sa 02.10.10 18:41
HenryHux hat folgendes geschrieben : | 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
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 02.10.10 18:42
|
|