Hilfe beim Einstieg - Tutorial Fehlerhaft?



  • Hallo nochmal,

    ich bin erstaunt wie schnell man hier antworten bekommt :o

    Leider funktioniert es noch immer nicht (stelle ich mich evtl. zu dumm an?)

    Hier also noch einmal der ganze Code meines winzigen Programmes. Vieleicht stößt mich ja jemand mit der Nase darauf, was genau der Fehler ist.

    #include <iostream>
    void wait()
    {
         std::cin.clear();
         std::cin.ignore(std::cin.rdbuf()->in_avail());
         std::cin.get(); 
    }
    
    #include <iostream>
    using namespace std;
    
    int main()
    
    {
    
    int zahl1;
    int zahl2;
    int zahl3;
    
    cout<<"Geben sie eine Zahl ein!\n";
    cin>>zahl1;
    cout<<"Geben sie eine weitere Zahl ein!\n";
    cin>>zahl2;
    cout<<"Geben sie zum Schluß eine dritte Zahl ein!\n";
    cin>>zahl3;
    
    cout<<"Ihre Eingaben lauten: \n";
    cout<<zahl1<<" "<<zahl2<<" "<<zahl3<<"\n";
    wait(); 
    
    }
    


  • #include <iostream>
    
    void wait(void);
    
    const unsigned short count_numbers = 3;
    
    int main()
    {
        unsigned int zahlen[count_numbers];
    
        for (unsigned short n = 0; n < count_numbers; ++n)
        {
            std::cout << "Geben sie eine " << (n + 1) << ". Zahl ein!" << std::endl;
            std::cin >> zahlen[n];
        }
    
        std::cout << "Ihre Eingaben lauten:" << std::endl;
    
        for (unsigned short n = 0; n < count_numbers; ++n)
            std::cout << zahlen[n] << "; ";
    
        wait();
        return 0;
    } 	
    
    void wait(void)
    {
         std::cin.clear();
         std::cin.ignore(std::cin.rdbuf()->in_avail());
         std::cin.get();
    }
    

    So das ganze mal ein wenig optimiert usw ^^



  • Also ich habe nun nocheinmal mit ein wenig programmiertechnischen Beistand getüftelt und habe es hinbekommen - jedoch nur wenn ich nach dem "cin.get();" in der Funktion "Wait" ein weiteres "cin.get();" einfüge - ansonsten geht es nicht.

    @Dark: Nachdem ich mich mit Hilfe durch deinen Code gekämpft hatte(für nen Anfänger nicht leicht zu verstehen >_< ) hab ich es einfach mal wissen wollen und das ganze kopiert + compiliert. Ergebniss = Selber Fehler _

    Es scheint also das er beim "ersten" "cin.get();" in der hier beschriebenen Wait Funktion noch irgendetwas im Puffer haben muss was das erste Warten ausführt und ihn somit beendet - aber was? Die Puffer sind doch geleert worden?

    Evtl. jemand eine Idee?

    Grüße

    GrayFox



  • Hi,
    hatte dasselbe Problem wie du ( auch mit Dev-C++, vllt spinnt der tatsächlich da ein wenig).
    Du kannst mal probieren, das

    std::cin.ignore(std::cin.rdbuf()->in_avail());
    

    durch

    std::cin.ignore(std::numeric_limits<int>::max(),'\n');
    

    zu ersetzen, hat zumindest bei mir funktioniert...

    Blacker



  • ignore kann mit einem oder zwei Argumenten aufgerufen werden.

    std::cin.ignore(1, std::cin.rdbuf()->in_avail());
    

    funktioniert auch unter DEV 4.9.9.2

    Eventuell kann das ja ein wenig eleganter in die FAQ eingearbeitet werden.

    MfG f.-th.



  • Ich habe am Anfang einfach ein #include <conio.h> eingefügt und an der stelle an der es geschlossen werden soll getch();
    Dann schließt das erst wenn ich and er Stelle von getch(); eine beliebige taste drücke...



  • Jop und conio.h gibt es aber nur unter Windows ...



  • Noch was im Netz gefunden

    statt

    std::cin.ignore(std::cin.rdbuf()->in_avail());
    

    besser

    std::cin.sync();
    

    vielleicht mal mit verschiedenen Compilern testen und Erfahrungsberichte.
    Das mit dem ignore wird zwar in verschiedenen Tutorials empfohlen, funktioniert
    z.B. mit dem DEV 4.9.9.2 nur von Fall zu Fall.
    Der free bcc5.5 macht bisher das was er soll, werde den aber noch weiter testen.

    MfG f.-th.



  • Hi,

    hat tatsächlich damit funktioniert!

    Werd mir die Syntax des ganzen nochmal angucken und den Inhalt verinnerlichen. Vielen Dank!

    -GrayFox



  • Nachtrag: Die sync - Variante wird vom free bcc5.5 NICHT immer korrekt ausgeführt.

    Der aktuelle Openwatcom scheint sich ähnlich wie der bcc zu verhalten.

    MfG



  • Gibt es denn eine "universal" Variante welche unter allen Compilern funktioniert? Oder wie mache ich das nun am besten?

    Geht halt darum das ich ja frisch mit c++ angefangen hab und es aber am liebsten von Anfang an "richtig" lernen will.

    Dazu noch eine frage zum Post von f-th: Was genau bewirkt dieses "std::cin.ignore(1, std::cin.rdbuf ->in_avail()); ?

    Grüße

    -GrayFox



  • Die von blacker angegebene Variante (mit numeric_limits) sollte eigentlich jeder Compiler umsetzen können.

    Was genau bewirkt dieses "std::cin.ignore(1, std::cin.rdbuf ->in_avail()); ?

    ignore(n) liest und verwirft solange Zeichen aus der Eingabe, bis es 'n' Zeichen ignoriert hat oder auf ein Zeilenende trifft, in_avail() gibt an, wieviele Zeichen noch im Eingabepuffer warten.
    (bei einigen Compilern klappt das nicht, weil in_avail() nicht die Füllung des Tastaturpuffers ausgeben muß)

    @f-th.: Ja, ignore() kann mit zwei Parametern verwendet werden - aber dann gibt immer noch der erste Parameter die Anzahl der ignorierten Zeichen an (der zweite Parameter bestimmt das Zeichen, das als Zeilenende dient).



  • CStoll schrieb:

    Die von blacker angegebene Variante (mit numeric_limits) sollte eigentlich jeder Compiler umsetzen können.

    Was genau bewirkt dieses "std::cin.ignore(1, std::cin.rdbuf ->in_avail()); ?

    ignore(n) liest und verwirft solange Zeichen aus der Eingabe, bis es 'n' Zeichen ignoriert hat oder auf ein Zeilenende trifft, in_avail() gibt an, wieviele Zeichen noch im Eingabepuffer warten.
    (bei einigen Compilern klappt das nicht, weil in_avail() nicht die Füllung des Tastaturpuffers ausgeben muß)

    "in_avail" steht für "alle noch verfügbaren/restlichen Eingaben"?



  • theoretisch ja - praktisch ist es der Implementierung des Stream-Buffers überlassen, was er dort für einen Wert herausgibt.



  • Soo, ein letzer Nachtrag:

    Es funktioniert nun auch mit folgender Code Zeile:

    std::cin.ignore(1, std::cin.rdbuf()->in_avail());
    

    Dem aufmerksamen Leser dürfte aufgefallen sein das ich in den vorherigen Posts innerhalb der ersten Klammeröffnung das "1, ... " vergessen habe. Damit wäre wohl auch erklärt warum es funktionierte wenn man einfach ein weiteres "std.get();" anhängte an die Funktion! (So wie ich das sehe zumindest).

    Ich danke jedenfalls allen für die Hilfe und werde mich nun weiter an's lernen machen. Denn diesesmal will ich es auch bis zum Ende lernen! 🙂

    Gruß

    GrayFox


Anmelden zum Antworten