while schleife: Abbruchbedingung gesucht für cin>>mem1



  • 😮 Er hat recht. Es funktioniert mit dem MinGW (4.6.1) wirklich nicht. Habs eben ausprobiert.

    #include <iostream>
    #include <vector>
    #include <limits>
    using namespace std;
    
    int main()
    {
        vector<int> ivec1, ivec2;
    	cout << "Series of numbers for ivec1:" << endl;
    
        int mem1;
        while(cin >> mem1 && mem1 != 9999);
    
        cin.clear();
        cin.ignore(numeric_limits<unsigned int>::max(), '\n');
    
        cout << "\nSeries of number for ivec2:" << endl;
        while(cin >> mem1 && mem1 != 9999);
    }
    

    Funktioniert nicht.

    So funktioniert es aber:

    #include <iostream>
    #include <vector>
    #include <limits>
    using namespace std;
    
    int main()
    {
        vector<int> ivec1, ivec2;
    	cout << "Series of numbers for ivec1:" << endl;
    
        int mem1;
        while(cin >> mem1 && mem1 != 9999);
    
        cin.clear();
        cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
    
        cout << "\nSeries of number for ivec2:" << endl;
        while(cin >> mem1 && mem1 != 9999);
    }
    

    😃 numeric_limits<unsigned int>::max() führt wohl zu einem Überlauf ( ignore will einen signed int haben) und damit zu UB.



  • out schrieb:

    😃 numeric_limits<unsigned int>::max() führt wohl zu einem Überlauf ( ignore will einen signed int haben) und damit zu UB.

    MinGW: sizeof(unsigned int) == 4 Byte
    MinGW: sizeof(std::streamsize) == 4 Byte

    MSVC11: sizeof(unsigned int) == 4 Byte
    MSVC11: sizeof(std::streamsize) == 8 Byte

    ➡ Wie eben angesprochen. ➡ Überlauf. An das hat nun eben auch keiner gedacht. Aber ist alles doch ganz logisch. 💡



  • Danke dir 😉
    Funktioniert jetzt auch bei mir mit Code::Blocks und Visual C++ 2010 express.


  • Mod

    Oh, na klar! Wie konnte ich bloß das unsigned int übersehen, nachdem ich Skym0sh0 schon für das falsche in_avail angefahren habe?

    Skym0sh0, besser aufpassen, was du schreibst 😉 !



  • 😃 war Absicht und alle sind drauf reingefallen 😃

    ~ne wars nicht 😞 *okayface.jpg*~



  • out schrieb:

    numeric_limits<unsigned int>::max() führt wohl zu einem Überlauf ( ignore will einen signed int haben) und damit zu UB.

    Nein, kein UB.

    §4.7/3 schrieb:

    If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.



  • SeppJ schrieb:

    Oh, na klar! Wie konnte ich bloß das unsigned int übersehen, nachdem ich Skym0sh0 schon für das falsche in_avail angefahren habe?

    Wie war das nochmal... ein alter Mann...

    Immer mit der Ruhe, ein alter Mann ist kein D-Zug Wikipedia-Löschadmin.

    Nachtrag: Meine Fresse! Der Thread ist ja eine Peinlichkeit ... bitte keiner den Link bereitstellen.


Anmelden zum Antworten