C++ Goto - Von Sprungmarke "zurückkehren"?
-
RAII macht da deutlich mehr Spaß als goto.
-
gotoHustbaer schrieb:
hustbaer schrieb:
Nein, du brauchst nie
goto(in Sinne von:gotoist nie notwendig/unumgänglich).Ist doch Quatsch
Es gibt Algorithmen mit verschachtelten Schleifen, die kann man sehrwohl mit einem goto alle verlassen.Ich glaube nicht dass du die Bedeutung von "brauchen", "notwendig" oder "unumgänglich" verstanden hast.
-
gotoHustbaer schrieb:
Für jeden kleinsten Käse eine eigene Funktion zu schreiben ist auch nicht gerade schöner Stil...
Ich halte goto für weitaus schlechteren Stil als kleine Funktionen, die dann auch noch eigenständig getestet werden können.
-
da kann man mal sehen, was bei dem ständigen "kein goto benutzeneinself" rauskommt: die leute können nicht mal mehr goto benutzen.

eine möglichkeit wäre jedenfalls
goto unterprogramm; rueckkehr_von_unterprogramm: //mach was unterprogramm: //mach was goto rueckkehr_von_unterprogramm;gerne auch in kombination mit zustandsvariablen.
-
hustbaer schrieb:
Nein, du brauchst nie
goto(in Sinne von:gotoist nie notwendig/unumgänglich).Das ist entweder eine Nullaussage, oder irreführend. Ich brauche auch nie eine höhere Programmiersprache, denn sie kompiliert ja sowieso zu Maschinencode. Aber wo
gotostilistisch vernünftig ist, kannst du nicht einfach kategorisch abschlagen.Wobei
for (...) for (...) { .. if (...) goto end; } end:fände ich gar nicht direkt abwegig, wenn
..nicht mehr als ein, zwei Zeilen enthält. Da würde ich nicht unbedingt in eine Funktion auslagern wollen, um irgendeiner Faustregel gerecht zu werden. In einem solchen Szenario istgotowomöglich einfach die prägnanteste Lösung.Edit: Da ich aber keine Praxiserfahrung habe, lass ich mich gerne vom Gegenteil überzeugen.
-
HansKlaus schrieb:
goto ... zustandsvariablen.
Soll das so eine Art Sammlung von Antipatterns sein? Dass die Leute damit nicht umgehen können, hat man vor 50 Jahren festgestellt und dann mühsam dafür gekämpft, es auszurotten. Und heute kommen Leute und propagieren das Gegenteil, weil sie nie kennen gelernt haben, wie es früher war. Erinnert mich sehr an die Impfverweigerer.
-
wenn mans unbedingt so machen möchte......
-
HansKlaus schrieb:
da kann man mal sehen, was bei dem ständigen "kein goto benutzeneinself" rauskommt: die leute können nicht mal mehr goto benutzen.

eine möglichkeit wäre jedenfalls
goto unterprogramm; rueckkehr_von_unterprogramm: //mach was unterprogramm: //mach was goto rueckkehr_von_unterprogramm;gerne auch in kombination mit zustandsvariablen.
Es ist aber gewünscht, unterprogramm von verschiedenen Stellen aus anzuspringen, und dann jeweiles zur 'richtigen' Absprungstelle zurückzukehren.
-
Belli schrieb:
Es ist aber gewünscht, unterprogramm von verschiedenen Stellen aus anzuspringen, und dann jeweiles zur 'richtigen' Absprungstelle zurückzukehren.
Er meint, dass du vor dem Sprung eine globale Variable setzen sollst, die dann das Rücksprungziel anzeigt. Du weißt schon: Saubere, fehlerrobuste Programmierung.
PS: Und bevor jemand fragt: Nein, offiziell kann man Labels nicht als Werte benutzen. Mindestens der GCC hat aber eine Spracherweiterung dafür:
#include <iostream> int main() { void *return_label = nullptr; goto main; sub_proc: std::cout << "Sub"; goto *return_label; main: std::cout << "A"; return_label = &&ret_1; goto sub_proc; ret_1: std::cout << "B"; return_label = &&ret_2; goto sub_proc; ret_2: std::cout << "C"; }
-
Arcoth schrieb:
Edit: Da ich aber keine Praxiserfahrung habe, lass ich mich gerne vom Gegenteil überzeugen.
Ich habe im Praxisumfeld noch nie ein goto gesehen das sinnvoll gewesen wäre und nicht in eine (meist auch noch verständlichere) andere Struktur überführt werden konnte. Eher im Gegenteil: Die gotos die ich zu Gesicht bekommen habe, hatten in der Regel schwerwiegende Seiteneffekte, waren schwer wartbar. Im schlimmsten Fall übelster Spagetthicode in Reinkultur den keiner mehr verstanden hat.
Es ist egal ob eine Hochsprache in Maschinencode überführt wird oder nicht - Maschinencode ist für den Rechner, nicht den Programmierer. Und wie heißt der Spruch so schön "Man liest Sourcecode häufiger, als das man ihn ändert". Lieber eine saubere Struktur die in sprechende Funktionen untergliedert ist, als Code der für den Computer, nicht aber den Leser geeignet ist.
-
SeppJ schrieb:
Saubere, fehlerrobuste Programmierung.
naja wenn man unbedingt goto verwenden will (langeweile, aufgabenstellung, unnötig kompliziertes programm, k.a.), ist das doch in ordnung, oder nicht?
-
SeppJ schrieb:
Belli schrieb:
Es ist aber gewünscht, unterprogramm von verschiedenen Stellen aus anzuspringen, und dann jeweiles zur 'richtigen' Absprungstelle zurückzukehren.
Er meint, dass du vor dem Sprung eine globale Variable setzen sollst, die dann das Rücksprungziel anzeigt. Du weißt schon: Saubere, fehlerrobuste Programmierung.
Mindestens der GCC hat aber eine Spracherweiterung dafür:#include <iostream> int main() { void *return_label = nullptr; goto main; sub_proc: std::cout << "Sub"; goto *return_label; main: std::cout << "A"; return_label = &&ret_1; goto sub_proc; ret_1: std::cout << "B"; return_label = &&ret_2; goto sub_proc; ret_2: std::cout << "C"; }
Ach sooo ... ja dann, sieht echt übersichtlich aus

-
HansKlaus schrieb:
SeppJ schrieb:
Saubere, fehlerrobuste Programmierung.
naja wenn man unbedingt goto verwenden will (langeweile, aufgabenstellung, unnötig kompliziertes programm, k.a.), ist das doch in ordnung, oder nicht?
Ja. Und wenn jemand den Nagel mit der Zange in die Wand hauen möchte, dann kann man ihm auch zeigen, wie man das am besten macht; oder man könnte ihm sagen, dass es vielleicht keine so gute Idee ist. Welches ist davon der bessere Ratschlag?
-
bill gates konnte soweit ich weiß mal nachweisen, dass ihm andere leute seine quellcodes geklaut haben, weil er der einzige war, der den code erklären konnte.

edit:
SeppJ schrieb:
Ja. Und wenn jemand den Nagel mit der Zange in die Wand hauen möchte, dann kann man ihm auch zeigen, wie man das am besten macht; oder man könnte ihm sagen, dass es vielleicht keine so gute Idee ist. Welches ist davon der bessere Ratschlag?
ich würde vorher nachfragen, ob wirklich unbedingt eine zange verwendet werden soll und dann nicht bevormundend sein wollen, völlig egal wie albern das erst einmal sein mag.
es ist meistens stressfreier, wenn sich die leute sowas selbst ausprobieren.
-
HansKlaus schrieb:
naja wenn man unbedingt goto verwenden will (langeweile, aufgabenstellung, unnötig kompliziertes programm, k.a.), ist das doch in ordnung, oder nicht?
Ich habe noch keinen Praxisfall erlebt, bei dem ein goto nicht zu genau dem geführt hat, was du als Gegenbeispiel aufgeführt hast: "unnötig kompliziertes programm".
Und aus Langeweile meidet man kein goto, sondern aus guten Gründen.
-
Ja klar, aber wenn jemand unbedingt goto benutzen will und sich nicht durch gutes Zureden davon abbringen lässt.....
Ich meinte übrigens aus Langeweile goto benutzen, nicht vermeiden.
-
Dann würde ich ihm trotzdem nicht empfehlen, mit globalen Zustandsvariablen noch eine zweite Packung Spaghetti in den Code zu werfen.
Alle "berechtigten" Benutzungen von goto, die in diesem Thread gezeigt wurden, sind aus gutem Grund solche, bei denen nur ein einziges Label und nur ein einziger, kurzer Sprung vorkommen.
-
Wie würde man es denn sonst machen, wenn es unbedingt goto sein soll und man die Sprungmarken nicht dynamisch festlegen kann?
-
Benutze einfach COBOL. Da gibt es den wunderschönen Befehl ALTER, der Sprungziele dynamisch ändert.
Es ist zwar der absolute Horror so ein Programm zu lesen oder gar zu verstehen, aber es gibt es.
-
HansKlaus schrieb:
Wie würde man es denn sonst machen, wenn es unbedingt goto sein soll und man die Sprungmarken nicht dynamisch festlegen kann?
Arbeit verweigern. Oder auf INTERCAL als Sprache bestehen. Das kennt das schöne Schlüsselwort "COME FROM".