unbekannter Fehler..



  • Ja das Programm läuft ja..
    Aber falsch..



  • Genau dafür ist Debugging gedacht. Du schaust dir Schritt für Schritt durch, schaust dir die Variablenwerte an, schaust, wo das Programm hinspringt, und vergleichst es mit dem, was du erwartet hättest.



  • Was mir beim ersten Drübersehen aufgefallen ist:

    if(Eingabe_Menü == "Start" || "start")
    

    muss heißen

    if(Eingabe_Menü == "Start" || Eingabe_Menü == "start")
    

    Das gilt analog auch für die anderen Stellen mit einem logischen ODER in deinem Code.

    MfG
    Chris_



  • Zunächst mal ist es ärgerlich das der Code unvollständig gepostet wurde.

    Ich gehe davon aus das mindestens das hier fehlt

    #include <windows.h>
    #include <tchar.h>
    #include <iostream>
    #include <string>
    
    using namespace std;
    
    bool Menü, Einstellungen_läuft, Spiel_läuft;
    string Eingabe_Menü, Eingabe_Einstellungen;
    
    unsigned Level, Score, Highscore;
    

    Momentan wird wohl sowohl

    if(Eingabe_Menü == "Start" || "start") { .. }
    

    sowie

    if(Eingabe_Menü == "Einstellungen" || "einstellugnen")  { .. }
    

    ausgeführt, was ja nicht sinnvoll sein dürfte.

    Besser wäre hier natürlich den Benutzer die Eingabe von Text zu ersparen.
    ->Auswahl mit Cursortasten wäre üblich.

    Naja, wenn schon sollte es aber zumindest fehlertolerant sein.

    Also besser

    if(CompareCI(Eingabe_Menü, "Start")) // == "Start" || "start")
    

    oder auch

    if(CompareCI(Eingabe_Einstellungen, "Hauptmenü") || CompareCI(Eingabe_Einstellungen, "Menü"))
    

    Leider muss man Case Insentitive Stringvergleiche selbst programmieren wenn man
    einfache strings verwenden möchte.

    Ein Anfang wäre:

    bool CompareCI(const string& str1, const string& str2) { 
        if (str1.size() != str2.size()) { 
            return false; 
        } 
        for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) { 
            if (tolower(*c1) != tolower(*c2)) { 
                return false; 
            } 
        } 
        return true; 
    }
    

    Dann ist mir noch aufgefallen, das endl; oft am Anfang einer Ausgabe steht.
    Das sollte besser am Ende stehen wg. gepufferter I/O.

    Deutsche Umlaute in Variablennamen sollte man eher meiden.

    Bei der Ausgabe kann man sich dagegen den Umstand sparen.

    Ein einfaches

    setlocale(LC_ALL, "German");
    

    zum Programmbegin in main() erspart z.B. das hier

    // Leerzeichen(20); cout << " o Hauptmen\201 "; 
    Leerzeichen(20); cout << " o Hauptmenü";
    

    siehe auch: Language and Country/Region Strings
    http://msdn.microsoft.com/en-us/library/hzz3tw78(v=vs.100).aspx



  • merano schrieb:

    bool CompareCI(const string& str1, const string& str2) { 
        if (str1.size() != str2.size()) { 
            return false; 
        } 
        for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) { 
            if (tolower(*c1) != tolower(*c2)) { 
                return false; 
            } 
        } 
        return true; 
    }
    

    Warum nicht:

    bool CompareCI(const string& str1, const string& str2) {
      std::equal(str1.begin(), str1.end(), str2.begin(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2) }); // Alternativ als eigene Funktion statt Lambda wenn kein C++11 verfügbar ist. 
    }
    


  • pyhax schrieb:

    Warum nicht:

    bool CompareCI(const string& str1, const string& str2) {
      std::equal(str1.begin(), str1.end(), str2.begin(), [](char c1, char c2) { return std::tolower(c1) == std::tolower(c2) }); // Alternativ als eigene Funktion statt Lambda wenn kein C++11 verfügbar ist. 
    }
    

    Sieht interessant aus, führt aber bei mir (mit VS2010) zu folgenden Fehlern:

    snakemain.cpp(40): error C2039: 'tolower': Ist kein Element von 'std'
    snakemain.cpp(40): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    snakemain.cpp(40): error C2143: Syntaxfehler: Es fehlt ';' vor '}'
    

    Für einen Anfänger ist das vermutlich auch absolut unverdaulich ..



  • Natürlich würde es auch mit equal gehen 😉

    bool chkit ( int elem1, int elem2 ) {
       return tolower(elem1) == tolower(elem2);
    }
    
    bool CompareCI(const string& str1, const string& str2) { 
      return std::equal(str1.begin(), str1.end(), str2.begin(), chkit );  
    }
    

    PS: Das return fehlte auch noch ...



  • merano schrieb:

    Natürlich würde es auch mit equal gehen 😉

    bool chkit ( int elem1, int elem2 ) {
       return tolower(elem1) == tolower(elem2);
    }
    
    bool CompareCI(const string& str1, const string& str2) { 
      return std::equal(str1.begin(), str1.end(), str2.begin(), chkit );  
    }
    

    PS: Das return fehlte auch noch ...

    return und semikolon fehlte ... 😃 Ich hätte es vielleicht doch lieber vorher testen sollen



  • Danke erstmal (:

    Ich werd mal schaun ob ich das hinbekomme..



  • Danke
    Hat perfekt geklappt.

    Hab das jetzt mit switch und _getch() gelöst.

    Vielen dank.


Anmelden zum Antworten