Hilfe beim Einstieg - Tutorial Fehlerhaft?



  • Also ich habe mich nun dazu entschlossen C++ zu lernen und habe mir dazu auch gleich ein Tutorial herausgesucht welches mir angemessen erscheint. Der Stil gefällt mir gut und ist auch recht verständlich geschrieben, zumal ich ein paar wenige Programierkenntnisse auch schon besitze.

    So, nun aber zu meinem kleinen Problem:

    Ich bin nun beim 3ten Schritt des Tutorials angelangt; jene Stelle an der man 3 Zahlen einen Wert geben soll (wird vom Benutzer eingegeben) und die dann danach angezeigt werden sollen.
    Jedoch sobald ich die 3te Zahl eingegeben habe und auf Enter drücke schließt sich das Fenster. Dann habe ich einmal den Code direkt aus dem Tutorial in meinen Compiler gejagt und siehe da - exakt das selbe Problem!

    Nun ist die Frage: Hat sich dort ein kleiner Fehler eingeschlichen(die Logik stimmt eigentlich soweit 😕 ) oder stimmt mit meinem Compiler etwas nicht?

    Ich benutze den Compiler von der Seite http://www.bloodshed.net namens "Dev-C++" .

    Hier einmal der Code um den es geht :

    #include <iostream>
    using namespace std;
    
    int main()
    {
    int zahl1;
    int zahl2;
    int zahl3;
    
    cout<<"Geben sie bitte eine Zahl ein!\n";
    cin>>zahl1;
    cout<<"Geben sie bitte 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";
    }
    

    Das Tutorial welches ich nutze wurde aber auch auf dieser Seite hier empfohlen -
    http://tutorial.schornboeck.net/inhalt.htm

    Ich hoffe das mir hier schnell weitergeholfen werden kann - würde mich freuen möglichst schnell weiterlernen zu können, bevor ich aber weitergehe in der Syntax hätte ich gerne den Fehler gefunden.

    Grüße

    -Kaze



  • Offenbar erwartet der Autor nicht, daß du das Programm per Doppelklick startest. Wenn du es aus der Kommandozeile laufen lässt, bleiben die Ausgaben sichtbar.

    Zur Lösung deines Problems empfehle ich einen Blick in die Konsolen-FAQ - Automatisches Schließen verhindern.



  • In die FAQ oder Suchfunktion schauen.
    http://www.c-plusplus.net/forum/viewforum-var-f-is-20.html



  • Hallo,

    danke erstmal für die schnellen Antworten. Jedoch funktioniert keine von den beiden Möglichkeiten welche in der FAQ angegeben sind, nach wie vor immer das selbe Problem.

    Muss ich das

    #include <iostream> 
    
    void wait () 
    { 
        std::cin.clear(); 
        std::cin.ignore(std::cin.rdbuf()->in_avail()); 
        std::cin.get(); 
    }
    

    eigentlich einfach an die letzte Zeile anhängen oder muss ich das irgendwie anders "integrieren" ?

    Hat evtl. noch jemand eine Idee?

    Grüße

    GrayFox



  • Das da definiert die Funktion wait(), das mußt du in dein Programm einbauen. Aber vor allem mußt du die Funktion auch aufrufen (als letzten Befehl der main()-Funktion).



  • Du musst die Funktion wait() vor main() definieren (also den Block da hin packen, Details lassen wir für den Anfang mal aussen vor), und sie am Ende von main() natürlich auch aufrufen. Die Include-Direktiven kommen gesammelt an den Anfang der Quelldatei.

    void wait () 
    { 
        std::cin.clear(); 
        std::cin.ignore(std::cin.rdbuf()->in_avail()); 
        std::cin.get(); 
    }
    
    int main()
    {
        /* bla, blubb, fasel */
        wait();
    }
    


  • 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.


Log in to reply