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



  • Das nennt sich Funktionsaufruf. Und funktioniert sogar ohne goto!


  • Gesperrt

    Vielleicht bei XX_1 eine marke2: einfügen und unten ein goto zu dieser marke2.

    Was aber passiert, wenn man zwei "marken" mit dem gleichen Namen hat, weiss ich nicht.



  • SG1 schrieb:

    Das nennt sich Funktionsaufruf. Und funktioniert sogar ohne goto!

    Das habe ich doch sogar noch beschrieben. Mit Funktionen wärs einfacher, aber es ist in diesem Falle nicht gestattet.

    manni66 schrieb:

    Nein, das gibt es nicht. Das musst du zu Fuß machen.

    titan99_ schrieb:

    Vielleicht bei XX_1 eine marke2: einfügen und unten ein goto zu dieser marke2.

    Was aber passiert, wenn man zwei "marken" mit dem gleichen Namen hat, weiss ich nicht.

    Danke euch beiden, ich muss sonnst mal schauen wie ich das Problem löse.



  • Du kannst was mit setjmp und longjmp zusammenbasteln. Aber das wäre C und du programmierst in C++, und in C++ braucht man goto nicht.



  • Gast1 schrieb:

    Hi! Ich brauche Goto für ein bestimmtes Projekt.
    (...)
    Ich möchte nur wissen, ob es eine Möglichkeit gibt von einem Goto-Sprung zurückzukehren?

    Nein, du brauchst nie goto (in Sinne von: goto ist nie notwendig/unumgänglich).
    Lern einfach ordentlich programmieren. Dann kannst du das "zurückzukehren" - wie SG1 schon geschrieben hat - einfach mit einem Funktionsaufruf machen (bzw. dem return davon).



  • hustbaer schrieb:

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

    Ist doch Quatsch 😉 Es gibt Algorithmen mit verschachtelten Schleifen, die kann man sehrwohl mit einem goto alle verlassen. PHP hat da einen großen Vorteil - es erlaubt z.B. einem "break" auch die Anzahl der Ebenen zu übergeben, die verlassen werden sollen.

    Ähnlich wenn z.B. vor einem Return z.B. kleine Cleanup Aufgaben ausgeführt werden sollen, und eine Funktion an mehreren Stellen beendet werden kann.

    Für jeden kleinsten Käse eine eigene Funktion zu schreiben ist auch nicht gerade schöner Stil... Du solltest goto lediglich sparsam einsetzen und stark aufpassen 👍 Mitunter gibt es sinnvollere und sicherere Methoden ein goto zu umgehen.



  • RAII macht da deutlich mehr Spaß als goto.



  • gotoHustbaer schrieb:

    hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist 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.


  • Mod

    hustbaer schrieb:

    Nein, du brauchst nie goto (in Sinne von: goto ist 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 goto stilistisch 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 ist goto womöglich einfach die prägnanteste Lösung.

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


  • Mod

    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.


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


Anmelden zum Antworten