Fehler bei Char-Funktion



  • proggingmania schrieb:

    Sorry, hast Recht, das hakt ab und an mal.

    Ja leider...
    Aber trotzdem danke 🙂



  • Habs nochmal probiert, die Falle bzw. der Haken liegt wohl am Datentypen.
    Wenn menue signed int ist, dann wird es bei der Eingabe eines Zeichens, das keine Zahl ist, negativ.

    int menueeinundausgabe()
    {
        unsigned int menue;
    
        do
        {
           printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3"
                                                       " Spieler vs. Computer\n");
    	   fflush(stdin);
    		scanf( "%d", &menue );
            system("cls");
        }
        while( menue < 0 || menue > 3 );
    
        return menue;
    }
    
    int main()
    {
        printf("%d\n", menueeinundausgabe());
        return 0;
    }
    

    So dürfte es nu funzen 🙂



  • k:\backup\thomas\schule\test\test.cpp(23) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei

    Ähhhhhh, was bedeutet des? Ich hab nur den Code von dir mal in den Compiler reingeschmissen. Also die Klammern stimmen.
    Aber mal so: Auf Buchstaben reagiert es doch immernoch mit ner Endlosschleife oder?

    Edit:
    Oki, vergess es... Hab die Header ja garnich included *schäm*



  • Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*



  • Buchstaben werden quasi ingoriert und es wird weiter abgefragt.
    Also quasi ist das ne Endlosschleife, bis eine Zahl von 0 bis 3 eingegeben wird.



  • Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei ...
    Das ist Visual Studio Standardeinstellung.
    Kannst du bei Projekt/Einstellungen/C++/Vorkompilierte Header
    deaktivieren durch setzen des entsprechenden Radio Buttons einstellen.



  • proggingmania schrieb:

    Buchstaben werden quasi ingoriert und es wird weiter abgefragt.
    Also quasi ist das ne Endlosschleife, bis eine Zahl von 0 bis 3 eingegeben wird.

    Des versteh ich schon. Aber ich schwöre bei Gott, ich hatte des mal so ähnlich, auch die Eingabe über integer und die Abfrage obs denn auch die Zahlen sind. Und als ich zum Beispiel a eingegeben hatte kam die Endlosschleife... warum ach immer.
    Des irritiert mich jetzt n bissl. Aber trotzdem danke 🙂

    Kannst du bei Projekt/Einstellungen/C++/Vorkompilierte Header
    deaktivieren durch setzen des entsprechenden Radio Buttons einstellen.

    Ähm... Bringt mir des einen Vorteil? Wenn der doch merkt dass ne header fehlt dann funzt des Prog doch eh net korrekt oder?



  • GlobalDeeJay schrieb:

    Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*

    Tja, das frage ich mich auch gerade.



  • Tja, das frage ich mich auch gerade.

    Hmm...Schau mal in die Zeile 9 deines letzten Codes... CStoll wird dich dafür hassen *gg*
    Naja, aber wie heißt? Don't change a running System, dann lass ma des bei Code einfach auch so 🙂
    Soll ja recht sein wenns funzt, wenn du rausfindest wieso wärs toll. Ich gebs auf. Zu viel Codes am Morgen :S



  • proggingmania schrieb:

    GlobalDeeJay schrieb:

    Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*

    Tja, das frage ich mich auch gerade.

    bestimmts liegt's am 'fflush(stdin)' --> undefiniertes verhalten.



  • bestimmts liegt's am 'fflush(stdin)' --> undefiniertes verhalten.

    Naja... abers funktioniert mit dem undefinierten Verhalten... 🙂



  • GlobalDeeJay schrieb:

    bestimmts liegt's am 'fflush(stdin)' --> undefiniertes verhalten.

    Naja... abers funktioniert mit dem undefinierten Verhalten... 🙂

    ja, manchmal ....
    😃



  • Eeeeeendlich, jetzt hab ichs !
    Es liegt an dieser Schleife:
    while ((menue = getchar()) != EOF && menue != '\n');

    Ob menue nun int menue, oder unsigned int menue ist, völlig wumpe.

    Die obige Schleife ist dann ne Endlosschleife, in der das Programm
    munter nach einem EOF oder '\n' sucht, das es noch nicht gibt.

    Da ja vorher das Menü erscheint, merkt man nichts davon, weil ja das Programm richtig zu funktionieren scheint und auf eine Eingabe wartet.

    Gibt man nun einen Wert ein, dann wird dieser in den Puffer übernommen und von der while Schleife verworfen.
    Es bleibt dann nur ein '\n' in menue übrig.

    Man denkt nu, man hätte etwas korrekt eingegeben. Hat man auch, aber es ist nicht in der Variable menue gelandet, sondern im Nirvana des Ram.

    Nachdem nun die while-Schleife zufrieden aus der Endlosschleife hüpft, da ja nun ein '\n' existiert, kommt es erst jetzt zur eigentlichen Eingabe.
    Erst jetzt wird scanf aufgerufen.

    Das also war die Ursache des 'Hakens', das nur einmal passiert, nämlich beim Einritt in die Funktion
    Mit fflush(stdin); gibt es dieses Problem nicht. 🙂



  • Benutze man: fgets(3), damit liest du die ganze Zeile ein und kannst bequem parsen, ohne stdin leeren zu müssen.

    Außerdem: fflush(stdin) ist eine Microsoft Missgeburt oder egal auch immer, wer damit angefangen hat. fflush(stdin) ist Bullshit, weil stdin ein Eingabepuffer ist und fflush die Ausgabepuffer leert, somit ist fflush(stdin) auf richtige Betriebssysteme undefiniert.



  • supertux schrieb:

    ... weil stdin ein Eingabepuffer ist und fflush die Ausgabepuffer leert ...

    Dazu mal ein Auszug aus der MSDN:
    ...
    If the file associated with stream is open for output, fflush writes to that file the contents of the buffer associated with the stream. If the stream is open for input, fflush clears the contents of the buffer. fflush negates the effect of any prior call to ungetc against stream. Also, fflush(NULL) flushes all streams opened for output. The stream remains open after the call. fflush has no effect on an unbuffered stream.
    ...

    Damit ist also auch der Eingabepuffer gemeint.
    Bei Linux mag das anders sein.



  • Die obige Schleife ist dann ne Endlosschleife, in der das Programm
    munter nach einem EOF oder '\n' sucht, das es noch nicht gibt.

    Da ja vorher das Menü erscheint, merkt man nichts davon, weil ja das Programm richtig zu funktionieren scheint und auf eine Eingabe wartet.

    Tut mir leid, aber fürn Anfänger ist des bissl hart formuliert...
    Kannst des auch fürn "dummy" erklären?



  • Zugegeben, ich habe mich da möglicherweise ziemlich umständlich ausgedrückt. 🤡

    Also, beim Programmstart, wenn noch nichts eingegeben wurde, bleibt das Programm bei der while-Schleife hängen.
    Dann gibts du etwas ein und drückst enter.
    Das eingegebene wird in der while-Schleife verworfen und dann erst wird scanf aufgerufen.

    Wenn du mit einem Debugger da durchgehst dann merkst du das schon 😉

    So, ich geh mich jetzt in die Sonne legen. 🕶 🙂 🕶
    Gruß,
    p.


Anmelden zum Antworten