C++ Goto - Von Sprungmarke "zurückkehren"?



  • 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.


  • Mod

    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 🙄


  • Mod

    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.


  • Mod

    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.


  • Mod

    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".



  • Arcoth schrieb:

    hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist nie notwendig/unumgänglich).

    Das ist entweder eine Nullaussage, oder irreführend.

    Du musst das schon im Zusammenhang betrachten.
    Gast1 hat geschrieben dass er goto für ein bestimmtes Projekt braucht.

    Gast1 schrieb:

    Hi! Ich brauche Goto für ein bestimmtes Projekt.

    Und im Weiteren dann gefragt ob man von goto irgendwie wieder zurückspringen kann. Spätestens da ist für mich klar, dass es wohl nicht um einen sinnvollen Einsatz von goto geht, und dass eine goto -freie Lösung mit an Sicherheit grenzender Wahrscheinlichkeit besser ist. Daher meine Antwort dass er goto sicher nicht braucht.

    Arcoth schrieb:

    Edit: Da ich aber keine Praxiserfahrung habe, lass ich mich gerne vom Gegenteil überzeugen.

    Aus der Praxis kann ich nur sagen, dass ich seit geschätzten 10 Jahren kein goto mehr geschrieben habe, und dass es nie ein echtes Problem war darauf zu verzichten. Und es mMn. auch nie zu vergleichsweise unschönem oder umständlichen Code geführt hat. Oft genug wird der Code dadurch sogar übersichtlicher/einfacher zu verstehen.

    ps: Ich war auch lange Zeit im " goto für multi-break ist OK" Lager. Bin ich grundsätzlich auch immer noch. Geändert hat sich diesbezüglich bloss, dass ich einfach schon so ewig überhaupt kein goto mehr geschrieben habe, dass ich jetzt der Meinung bin dass sich auch "multi-break goto s" quasi immer sehr einfach und ausreichend elegant vermeiden lassen.



  • SeppJ schrieb:

    Arbeit verweigern. Oder auf INTERCAL als Sprache bestehen. Das kennt das schöne Schlüsselwort "COME FROM".

    Hahaah, INTERCAL war sogar mir neu. Spielt in der Liga von Brainfuck mit.



  • Nein man braucht auch kein goto, eigentlich braucht man nicht mal mehr wirklich Programmiersprachen, weil man sich mittlerweile alles schön zusammen klicken kann.

    Aber wo besteht denn jetzt das Problem, wenn das irgendjemand für sich trotzdem so machen will?


  • Mod

    Freunde lassen Freunde kein goto benutzen.



  • Ganz schöne Bevormundung irgendwie....



  • HansKlaus schrieb:

    Ganz schöne Bevormundung irgendwie....

    Niemand wird gezwungen sich an die Aussagen im Forum zu halten, dennoch ist es unsinnig jemanden Bad-Practice beizubringen. In sofern gibt es eine gewisse Bevormundung: Man versucht keinen schlechten Code zu unterstützen. Das Forum soll helfen, nicht schaden (und eine schlechte Angewohnheit wird man selten wieder schnell los).


Anmelden zum Antworten