C++ Programm läuft nich so, wie es soll



  • Fehler ist im Prinzip nur, dass die Console geschlossen wird, sobald ENTER gedrückt wird.
    Ausgegeben wird nichts.
    Habe auch zum Test mal das Programm so erweiter:

    #include <iostream>
    int main()
    {
       int sum = 0, value;
       while(std::cin >> value)
          sum+=value;
       std::cout << "Summe ist: " << sum << std::endl;
       std::cin >> sum;
       return 0;        
    }
    

    Einfach, damit das Programm noch wartet bevor es geschlossen wird.

    Geht leider so auch nicht 😢

    Wird einfach nichts ausgegeben.

    cya
    David



  • David777 schrieb:

    Fehler ist im Prinzip nur, dass die Console geschlossen wird, sobald ENTER gedrückt wird....

    -> 2.)



  • #include <iostream>
    int main()
    {
       int sum = 0, value;
       while(std::cin >> value)
          sum+=value;
       std::cout << "Summe ist: " << sum << std::endl;
       std::cin >> sum;
    }
    

    kann nicht gehen. Du ließt erst solange ein, bis std::cin das failbit gesetzt hat und verlangst dann, das es trotzdem danach wieder gehen soll?

    #include <iostream>
    #include <limits>
    
    int main()
    {
        unsigned int sum = 0, value;
        while (std::cin >> value) sum += value;
        std::cout << "Summe: " << sum << std::endl;
    
        std::cin.clear();
        std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
        std::cin.get();
    }
    

    ...



  • Eine ähnliche Vermutung hatte ich auch, aber im Buch steht genau das Gegenteil:

    [quote = "C++ Primer"]Bis wir auf EOF oder einen anderen Eingabestring stoßen, klappt der Test und der Rumpf der while-Anweisung wird ausgeführt. Dieser besteht aus einer einzigen Anweisung, die den zusammengesetzten Zuweisungsoperator benutzt. Der Operator addiert seinen rechten Operanden zum linken.

    Sobald der Test fehlschlägt, wird die while-Schleife beendet und wir führen die darauf folgenden Anweisungen aus. Sie gibt Sum und danach endl aus, was wiederum einen Zeileenbumbruch ausgibt und den cout -Puffer leert. [/quote]

    Das bedeutet, dass sobald ein Fehlerauftritt und das Failbit gesetzt wird, wird das Programm nicht beendet wird, sondern einfach die While-Schleife verlässt.

    cya
    David

    PS: Das Buch muss also unrecht haben? -.-



  • Hi,

    wie wärs, wen Du das Programm einfach aus einer bestehenden Konsole heraus aufrufst ?

    Mich wundert's immer wieder, dass hier seitenlang darüber diskutiert wird, wo das Problem doch eigentlich mit der Sprache gar nichts zu tun hat. Dasselbe passiert einem doch auch, wenn man jedes beliebige Skript "per Doppelclick ausführt"...

    Gruß,

    Simon2.



  • @David: hast du primer, den wo so ein malwerkzeug mit ner hand oben is(VIERTE AUFLAGE)?

    welche seite?



  • Ehm um das mal aufn Punkt zu bringen:

    C++ Primer schrieb:

    Bis wir auf EOF oder einen anderen Eingabestring stoßen, klappt der Test und der Rumpf der while-Anweisung wird ausgeführt. Dieser besteht aus einer einzigen Anweisung, die den zusammengesetzten Zuweisungsoperator benutzt. Der Operator addiert seinen rechten Operanden zum linken.

    Sobald der Test fehlschlägt, wird die while-Schleife beendet und wir führen die darauf folgenden Anweisungen aus. Sie gibt Sum und danach endl aus, was wiederum einen Zeilenumbruch ausgibt und den cout -Puffer leert.

    Das bedeutet, dass sobald ein Fehlerauftritt und das Failbit gesetzt wird, wird das Programm nicht beendet wird, sondern einfach die While-Schleife verlässt.

    Also. Das stimmt auch was dort steht. Allerdings ist deine Schlussfolgerung falsch. Du verlässt dein Programm ab dem Moment, in dem du die main-Funktion verlässt(return xyz;). Die Windows-Konsole bleibt allerdings nur solange geöffnet, wie das Programm läuft. Um das zu umgehen geht man hin und wartet am Ende seines Programmes einfach auf eine Eingabe des Benutzers(man kann auch std::cout << "Bitte eine Taste druecken" << std::endl; noch vor die std::cin.get();-Zeile setzen).
    Nun wird aber, wie auch in deinem "C++-Primer" korrekt beschrieben, die while-Schleife verlassen, sobald eine Eingabe nicht in int(oder dem entsprechenden Zieltypen) gepackt werden kann. Die while-Schleife wird verlassen, da der operator void* des std::cin-Streams NULL zurückgibt. Dies passiert dann, wenn das failbit(oder ein anderes der Bits, die Fehler indizieren) gesetzt ist.
    Damit du std::cin-Stream wieder nutzen kannst, musst du die falsche Eingabe aus dem Stream-Buffer schmeißen (std::cin.ignore(...)) und die failbits zurücksetzten(std::cin.clear()).

    Jetzt verstanden? 🤡



  • Ich habe Primer.
    Seite 40 🙂 Und die Hand mit dem Maler ist auch drauf 😉
    Ist auch die Vierte Auflage x.x.

    Verstanden habe ich das, was (D)Evil sagt, aber warum wird dann im Buch, was ja für Anfänger gedacht ist nicht darauf hingewiesen?
    Oder liegt es vielleicht wirklich einfach am Compiler.
    Ich benutze keinen GCC-Compiler sondern Dev-C++.

    bye
    David



  • David777 schrieb:

    ...aber warum wird dann im Buch, was ja für Anfänger gedacht ist nicht darauf hingewiesen?...

    Das kann mehrere Gründe haben:
    1. Sind die Schreiber in der Regel Menschen die sich schon mit der Materie auskennen, und man übersieht auch wenn man sich viel Mühe gibt durchaus den ein oder anderen Anfängerfehler (Nenn es von mir aus Scheuklappen, und mancher ist mehr der andere weniger vor gefeilt).
    2. Ich nehme mal an, das wenn man wirklich auf jeden möglichen Anfängerfehler eingeht, der C++ Primer mindestens doppelt bis dreimal so dick wäre.

    Ein Buch hat leider nicht die Möglichkeiten wie ein Dozent: Du kannst nur schlecht Rückfragen halten.

    cu André



  • Ein Buch hat leider nicht die Möglichkeiten wie ein Dozent: Du kannst nur schlecht Rückfragen halten.

    Ja. Ich denk da hast du irgendwo Recht 🙂 😃 😉 😃 🙂 😃 😉 🙂


Anmelden zum Antworten