goto;



  • Kennt jemand das Programm in dem ein goto verwendet wird, das nicht durch irgendeine andere Konstruktion ersetzt werden kann?



  • Gibt es so etwas überhaupt?

    AFAIK kann man ein goto immer ersetzen. Suchst du ein Programm, in dem es mit goto schneller geht?



  • Das soll es geben deswegen frage ich ja danach, es würde mich interessieren.



  • Hallo,

    schau dir die Linux sourcen an.Dort wimmelt es von gotos, die vor allem dazu dienen so etwas wie exceptions darzustellen. Man kann es auch ohne goto machen, allerdings würde das sehr viel mehr Teit benötigen und den Code noch komplexer machen.

    Gruß Tobias



  • Das werde ich mal machen.

    gruß hohesC



  • Hallo,

    in K & R wird beschrieben, daß jedes Programm mit goto immer in ein Programm ohne goto umgesetzt werden kann. Wie tobidope schon angesprochen hat, kann man in "Sonderfällen" goto einsetzen. Um noch einmal klarer zu machen, was mit den Sonderfällen gemeint ist, ein Link, in dem Mr. Kernighan himself etwas zu goto und den eventuell gerechtfertigten Einsatz sagt:

    http://www.lysator.liu.se/c/bwk-tutor.html#goto

    MfG



  • Kennt jemand das Programm in dem ein goto verwendet wird, das nicht durch irgendeine andere Konstruktion ersetzt werden kann?

    Wenn dein Begriffsverständniss von Konstrukion das Benutzen zusätzlicher Variablen nicht mit einbeschließt dann sei hier folgendes Beispiel genannt:

    /* ... */
    
    for (i = 0; i < 100; i++) {
        for (j = 0; i < 100; i++) {
            if (condition)
                goto done;
        }
    }
    
    done: 
    /* ... */
    

    mfg



  • goto_man schrieb:

    Wenn dein Begriffsverständniss von Konstrukion das Benutzen zusätzlicher Variablen nicht mit einbeschließt dann sei hier folgendes Beispiel genannt:

    /* ... */
    
    for (i = 0; i < 100; i++) {
        for (j = 0; i < 100; i++) {
            if (condition)
                goto done;
        }
    }
    
    done: 
    /* ... */
    
    void foo()
    {
    for (i = 0; i < 100; i++) {
        for (j = 0; i < 100; i++) {
            if (condition)
                return;
        }
    }
    }
    
    foo();
    


  • Begriffsverständniss von Konstrukion

    BLA,BLA,BLA

    for (i = 0; i < 100; i++)  
    { 
    	for (j = 0; i < 100; i++) 
    	{ 
    		if (condition) 
    			break; 
    	}
    	if (condition) 
    		break; 
    }
    

    @goto_man:KEINE CHANCE!!!!
    2.mal wiederlegt!!! 😃



  • @Shade
    Ich vermute mal goto_man möchte nach dem done: noch was machen. Sicherlich kann man das auch vor dem return machen. Aber wenn es mehrere solche Stellen gibt ist das unschöne Schreibarbeit und kann bei Änderungen zu Inkonsistenzen führen. Hab mir deshalb angewöhnt Funktionen kurz und knackig zu schreiben, so dass das return ausreicht.

    @hohesC
    Hab leider auch schon solchen Code gehabt. Würde mich heute allerdings für die goto Variante entscheiden, wenns denn unbedingt sein müsste. Was ist wenn du mehr als 2 verschachtelte Schleifen hast? Jedesmal

    if (condition)
        return;
    

    schreiben. Neee. Das wär mir echt zuviel unnützer Code.



  • Ok schlechtes Beispiel:

    void foo(void)
    {
        do_sth();
    
        for (i = 0; i < 100; i++) {
            for (j = 0; j < 100; j++) {
                if (condition) {
                    change_condition();
                    goto done;
                }
            }
        }
    
    done:
        do_sth_else();
    }
    

    Das bitte ohne zusätzlichen Overhead (weiterer Funktionsaufruf etc.) in Code ohne goto übersetzen.

    mfg



  • void foo(void) 
    { 
        do_sth(); 
    
        for (i = 0; i < 100; i++) { 
            for (j = 0; j < 100; j++) { 
                if (condition) { 
                    change_condition(); 
                    break; 
                } 
            } 
        } 
    
        do_sth_else();
    }
    


  • sorry muss jetz schlafen ...

    C/C++ Code: 
    void foo(void) 
    { 
        do_sth(); 
    
        for (i = 0; i < 100; i++) { 
            for (j = 0; j < 100; j++) { 
                if (condition) { 
                    change_condition(); 
                    break; 
                } 
            } 
        } 
    
        if(i<100) do_sth_else(); 
    }
    


  • groovemaster2002 schrieb:

    @Shade
    Jedesmal

    if (condition)
        return;
    

    schreiben. Neee. Das wär mir echt zuviel unnützer Code.

    Das stimmt.



  • Ein goto lässt sich immer ersetzen.



  • Eine Regel sollte man aber immer beherzigen: Springe niemals mit goto nach oben! Wenn ueberhaupt, nur nach unten.
    -Gunnar



  • hohesC schrieb:

    Darum geht es ja nicht. Ich will ja wissen ob jemand das Programm kennt in dem ein goto verwendet wird, das nicht durch irgendeine andere Konstruktion ersetzt werden kann?

    OK, ich hab das ganze allerdings eher unter dem Aspekt ersetzen ohne zusätzlichen unnützen Overhead gesehen.



  • OK, ich hab das ganze allerdings eher unter dem Aspekt ersetzen ohne zusätzlichen unnützen Overhead gesehen.

    Ist OK! 👍



  • Gunnar schrieb:

    Eine Regel sollte man aber immer beherzigen: Springe niemals mit goto nach oben! Wenn ueberhaupt, nur nach unten.
    -Gunnar

    ACK, nach oben geht überhaupt nie niemals auf Dauer gut.


Anmelden zum Antworten