Endlosschleife wird einfach beendet



  • Hi, ich habe ein Feld mit 5 bool Werten
    und eine Funktion welche false Werte aufspürt.
    Falls diese Funktion einen false Wert findet, soll sie die Position im Feld zurückgeben.
    Wenn die Funktion keinen false Wert findet, soll sie nichts zurückgeben.
    Ich initialisiere zunächst alle Felder mit false.
    Dann setze ich alle Felder auf true.
    Ich erwarte, dass dannach die Ausgabe:
    "Soll immer ausgegeben werden"
    endlos erfolgt.
    Aber das Programm wird beendet.
    Warum?

    #include <iostream>
    
    using namespace std;
    
    //Funktion um einen false Wert aufzuspüren
    int Suche(bool Plaetze[5]){
        for(int i=0; i<5; i++)
        {
            if(Plaetze[i]==false){
                cout<<"Nr "<<i<<" false!"<<endl;
                return i;}
        }
        cout<<"Kein Wert ist false!"<<endl;     //Das Programm wird trotz Endlosschleife
                                                //hier einfach beendet. Ich habe sogar bei
                                                //return 0 die Meldung:
                                                //'return' will never be executed.
                                                //Das dürfte eigentlich nicht sein!
    }
    
    
    int main(){
    
        bool Feld[5];           //Feld soll in main() erzeugt werden
    
        for(int i=0; i<5; i++){    //Alle Felder mit
            Feld[i] = false;       //false initialisieren
        }
    
    
        for(;;){
            cout<<"Soll immer ausgegeben werden\n";     //Weil das eine Endlosschleife ist, müsste
            cin.get();                                  //das doch immer ausgegeben werden.
                                                        //Wenn alle Werte true sind müsste es
                                                        //ständig ausgegeben werden
    
            cout<<"Initialisieren..."<<endl;
            int Var;
    
            Var = Suche(Feld);                          //Hier scheint der Fehler zu sein!
            Feld[Var] = true;                           //false Wert wird auf true gesetzt
    
    
        }       //Die Endlosschleife wird beendet. Warum?
    
        return 0;
    
    }
    

    Auch bei dieser Variante wird das Programm einfach beendet:

    #include <iostream>
    
    using namespace std;
    
    //Funktion um einen false Wert aufzuspüren
    int Suche(bool Plaetze[5]){
        for(int i=0; i<5; i++)
        {
            if(Plaetze[i]==false){
                cout<<"Nr "<<i<<" false!"<<endl;
                return i;}
        }
        cout<<"Kein Wert ist false!"<<endl;     //Das wird jetzt nie ausgegeben
    }
    
    
    int main(){
    
        bool Feld[5];           //Feld soll in main() erzeugt werden
    
        for(int i=0; i<5; i++){    //Alle Felder mit
            Feld[i] = false;       //false initialisieren
        }
    
    
        for(;;){
            cout<<"Soll immer ausgegeben werden\n";
            cin.get();
    
            cout<<"Initialisieren..."<<endl;
    
            int Var;                    //Ich setze jetzt das Feld nur auf true,
            if(Feld[Var] == false)      //wenn es flse ist
            {
                Var = Suche(Feld);
                Feld[Var] = true;                           //false Wert wird auf true gesetzt
            }
            Var++;
    
    
        }
    
        return 0;
    
    }
    

  • Gesperrt

    @theAnfänger77 sagte in Endlosschleife wird einfach beendet:

    int Var; //Ich setze jetzt das Feld nur auf true,
    if(Feld[Var] == false) //wenn es flse ist

    "Var" hat hat an der Stelle keinen definierten Wert, d.h. sehr wahrscheinlich existiert kein Feld[Var]. Somit kommt es zum Absturz. Dass dein Programm einfach aussteigt, ohne einen Fehler zu melden, ist eine Eigenart von Windows.



  • ja das liegt daran, dass am ende der funktion kein definierter return-wert festgelegt wird. eigentlich gibt der compiler da auch eine warnung aus.

    gib doch "-1" zurück, wenn nichts gefunden wurde und prüf dann darauf, das sollte funktionieren.


  • Gesperrt

    @Wade1234 sagte in Endlosschleife wird einfach beendet:

    ja das liegt daran, dass am ende der funktion kein definierter return-wert festgelegt wird. eigentlich gibt der compiler da auch eine warnung aus.

    Siehe: https://stackoverflow.com/questions/22234357/is-there-a-default-return-value-of-c-functions



  • @theAnfänger77 sagte in Endlosschleife wird einfach beendet:

    Falls diese Funktion einen false Wert findet, soll sie die Position im Feld zurückgeben.
    Wenn die Funktion keinen false Wert findet, soll sie nichts zurückgeben.

    Das geht nicht. Wenn du eine Funktion mit dem Rückgabetyp "int" hast, MUSS immer ein int zurückgegeben werden. Wenn du das nicht tust, ist dein Programm fehlerhaft - der Compiler warnt dich dann aber. Hast du Warnungen inzwischen angeschaltet?
    Du solltest bekommen: "warning: control reaches end of non-void function [-Wreturn-type]"

    Und wenn du dann ans Ende von Suche ein "return 0" hinschreibst, ist dieser Fehler zumindest behoben.

    Nur kannst du dann bei 0 nicht unterscheiden: nichts mehr frei oder Position 0? Daher könntest du z.B. -1 zurückgeben, wenn nichts gefunden wird. Das ist nie eine gültige Position. Im Hauptprogramm müsstest du die Rückgabe dann auf -1 testen.

    Alternative: schau dir an, wie std::find in der STL funktioniert.



  • "If you compile with a high warning level, the compiler will tell you about it." ganz unten.

    nach meinem wissen ist das jedenfalls so, dass der rückgabewert auf assemblerebene ins a-register gelegt wird und wenn du kein return xyz; schreibst, bleibt da der wert, der zuletzt drin war, erhalten, und das denn sich dann undefined behaviour.



  • Vielen Dank für die Antworten!
    Es funktioniert wenn ich den Wert den Suche() zurückgibt für jeden Fall angebe.
    Also:

    //Funktion um einen false Wert aufzuspüren
    int Suche(bool Plaetze[5]){
        for(int i=0; i<5; i++)
        {
            if(Plaetze[i]==false){
                cout<<"Nr "<<i<<" false!"<<endl;
                return i;}
        }
        cout<<"Kein Wert ist false!"<<endl;    
        return -1;
    }
    


  • Naja dass es funktioniert, würde ich nicht sagen, weil du in Main ja noch auf -1 prüfen musst.



  • 👍



  • @RBS2 sagte in Endlosschleife wird einfach beendet:

    Siehe: https://stackoverflow.com/questions/22234357/is-there-a-default-return-value-of-c-functions

    Damit die Information auch hier steht unabhängig von dem Link:

    in C und C++ ist es undefined behaviour wenn das return-value einer Funktion verwendet wird, die nichts zurückgibt.

    int foo() {};
    
    int main()
    {
        foo();  // scheißegal.
    }
    

    aber

    int main()
    {
        int v = foo();  // undefined.
    }
    

Anmelden zum Antworten