while statt goto
-
Hallo,
ich habe ein Problem. In einem recht komplexen Programm, bin ich bis jetzt immer mit "goto" zu einem definierten Startpunkt gesprungen. Nun gefällt der "goto"-Befehl meinem Betreuer an der Uni gar nicht. Also mache ich eine "while"-Schleife um alles und springe mit "continue" an den Anfang. Aber: in der "while"-Schleife sind noch zwei ineinander verschachtelte "for"-Schleifen. Wenn ich in denen "continue" anwende springt man ja nur an den Anfang von denen.
Wie springe ich auf einmal aus zwei "for"-Schleifen an den Anfang der eingrenzenden "while"-schleife?!
P.S.: Warum ist "goto" eigentlich so unschön? Wenn man das in einem übersichtlichen Rahmen gestaltet, müßte das doch okay sein
?!
-
goto gilt als verpönt (wobei es früher technisch gesehen gefährlicher war als heute) auch wenn es manchmal ziemlich hilfreich ist. In deinem Fall solltest du aber lieber in der for-Schleife ein Flag setzen, sie mit break verlassen und draussen prüfen ob das Flag gesetzt ist. Je nach dem machst du dann das continue. Es wäre aber besser für mich mal einen Ausschnitt zu sehen um eine Möglichkeit der Umstrukturierung zu erkennen.
-
post mal deine source und wir zeigen dir wo und wie du das ding optimieren kannst ... und wies richtig gemacht wird.
goto ist im prinzip gar nicht so schlimm wenn man es richtig nutzt. Aber wenn man sein Programm gut durchdacht und geplant hat kommt man nie in die Verlegenheit ein goto zu nutzen.
-
Wie wärs damit die inneren Schleifen einfach in ne Funktion auszulagern und die dann mit return zu verlassen?
-
1ntrud0r schrieb:
goto ist im prinzip gar nicht so schlimm wenn man es richtig nutzt. Aber wenn man sein Programm gut durchdacht und geplant hat kommt man nie in die Verlegenheit ein goto zu nutzen.
Manchmal benutze ich es in verschachtelten (übersichtlichen) Sachen wie ein "break 2;" um mir ein Flag zu sparen aber sonst eigentlich nie. Man sollte einen Befehl nicht als verpönt erklären, bloß weil man ihn nicht benutzen kann (nicht auf dich bezogen
). Dasselbe versuchen einige Leute mit Pointern ("Uh, da kann man soviel Scheiße mit machen; benutzt die nicht") zu machen.
EDIT: Naja, wenn wir den COde sehen wissen wir ja was sich anbietet
-
naja mastah im prinzip ist for und while ja auch nur eine (Fallabfrage,Anweisungsblock,Goto) -makro
nur um längen übersichtlicher ..
-
Natürlich, aber auf Assembler-Ebene ist jeder Sprung irgendeine Variante von jmp (jmp, je, jc...). Deswegen kann man noch lange nicht sagen while wird mit gotos realisiert. goto ist (sofern nicht irgendwas vom Compiler optimiert wurde) gleichzusetzen mit einem einfachen jmp. In Schleifen bieten sich je und Konsorten oftmals eher an.
-
deswegen steht da ja ein -> "im prinzip"
-
Ja, ich hab das schon verstanden
.
-
Ich poste einfach mal die gesamte Funktion. Wahrscheinlich versteht die ohnehin keiner, aber es geht ja auch nur um die Sprugstellen.
Kommt man mit break 2; gleich aus zwei verschachtelten Schleifen? Geht das auch mit continue 2; und anderen Zahlen (3,4,..)?
int process() { //whatever ;) }
Ich werde das jetzt mit einzelen Funktionen machen.
-
Die Funktion ist mir deutlich zu lang. Deshalb am besten aufbrechen in mehrere kleine Funktionen, da bieten sich die einzelnen Steps an. In der Funktion process entscheidest Du dann z.B. anhand des Rückgabewertes wie's weiter geht. Wenn Du außerdem noch die Fehlerbehandlung mit Exceptions macht, dann reicht Dir ein bool als Rückgabewert.
MfG Jester