cout funktioniert nicht



  • es fehlt ertsmal wieder das return 0; am ende. und dann sieht das wegen der einrückung so aus, als wenn du das ganze in eine funktion gepackt hast. falls nicht, dann eben nicht...

    Mfg Ominion



  • Ersetze die "wait ()" - Funktion mit dieser:

    void wait () 
    { 
        setvbuf(stdin,NULL,_IONBF,0); 
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ); 
        getchar(); 
    }
    

    MfG mikey.



  • Ersetze die "wait ()" - Funktion mit dieser:

    C/C++ Code:
    void wait ()
    {
    setvbuf(stdin,NULL,_IONBF,0);
    setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    getchar();
    }

    MfG mikey.

    Klappt perfekt, danke!

    grüße
    ziox.



  • Was wirdn hier zum Teil fürn Müll vonwegen das liegt an return 0; gepostet?!

    #include<iostream>
    
    void wait()
    {
        std::cin.clear();
        std::cin.ignore(std::cin.rdbuf()->in_avail());
        std::cin.get();
    }
    
    int main()
    {
        int zahl1 = 0;
        int zahl2 = 0;
    
        std::cout << "Bitte geben Sie eine Zahl ein: " << std::endl;
        std::cin >> zahl1;
        std::cout << "Bitte geben Sie eine weitere Zahl ein: " << std::endl;
        std::cin >> zahl2;
        std::cout << "Zahl 2: " << zahl2 << std::endl;
        std::cout << "Zahl 1: " << zahl1 << std::endl;
    
        wait();
    }
    

    So ... um deinen Fehler zu erklären ... wenn du oben using namespace std; hinschreibst, musst du in der wait Funktion die std:: weglassen, oder du schreibst(so wich ichs jetzt gemacht hab) vor jede Funktion aus dem std namespace, also cout, cin, usw, ein std:: .



  • Was wirdn hier zum Teil fürn Müll vonwegen das liegt an return 0; gepostet?!

    auf jeden fall gehört das "return 0;" dahin sonst ist es falsch!



  • krabbels schrieb:

    Was wirdn hier zum Teil fürn Müll vonwegen das liegt an return 0; gepostet?!

    auf jeden fall gehört das "return 0;" dahin sonst ist es falsch!

    nö main muss kein return haben, Wenn kein return kommt, wird automisch erfolg vermeldet 🤡



  • (D)Evil schrieb:

    So ... um deinen Fehler zu erklären ... wenn du oben using namespace std; hinschreibst, musst du in der wait Funktion die std:: weglassen

    ?

    Man darf doch trotzdem den namespace verwenden, auch wenn die using-Klausel benutzt wurde.



  • Also bei mir funktioniert jetzt alles einwandfrei(insofern man wait() einbaut), und ich wolte nochmal fragen(aus reiner Interesse)
    warum das denn s ist.
    liegt das am Compiler, am System, oder wo sonst?
    Immerhin wird das nirgends in nem Tutorial beschrieben das man sowas einbauen muss, und ich sehe ach des öfteren keine wait funktionen in manchen codes.

    Auch wenn ich manche programm öffne die bei Sampels von Dev c++ dabei sind, ist das nicht so.

    bitte klärt mich auf, würd mich echt interessieren.

    grüße
    ziox.



  • @(D)Evil: was kackst du hier so rum? Ich habe nicht gesagt, dass das an dem return 0; liegt! Ich habe ihn nur nochmal darauf aufmerksam gemacht, dass er das nicht hingeschrieben hat! Les dir meinen Post nochmal durch, ich habe nicht einmal was von einer Fehlerquelle geredet. Ich habe nur versucht mit dem letzten Teil etwas mehr zu erfahren. Also bevor du hier anfängst wieder Ratten laufen zu lassen, lese dir erstmal den kompletten Post durch wenn du dazu was schreibst.

    Ominion



  • Ich verzichte generell auf sowas wie die wait() Funktion.

    Nötig ist die nur wenn du das ganze mit Doppelklick auf die .exe starten willst und dann ist es meiner Meinung nach nicht sinnvoll auf die Ausgabe wert zu legen.

    Konsolenanwendungen sind nunmal dazu da, sie auf der Konsole auszuführen
    => Ausführen->cmd unter WinXP sonst gibts andere möglichkeiten ann eine Konsole zu kommen

    ->Programm aus der Konsole aufrufen (auf den Pfad achten!)

    -> wait is absolut unnötig

    EDIT:

    Ominion schrieb:

    es fehlt ertsmal wieder das return 0; am ende. und dann sieht das wegen der einrückung so aus, als wenn du das ganze in eine funktion gepackt hast. falls nicht, dann eben nicht...

    Mfg Ominion

    Diese Aussage ist falsch!
    return 0; fehlt nicht, da es nach ISO C++ bei main nicht nötig ist.



  • Ja jetzt sind wir an dem Punkt, konkretisieren wir das ganze mal ! Fakt ist nunmal, dass sich in ziox's Programmbeispiel noch etwas im Eingabepuffer befindet, dass dann als Eingabe interpretiert wird. Nun gut. Anschließend habe ich ihm eine Methode gezeigt, wie man den Puffer löschen kann, wobei sich später herausgestellt hat, dass es doch nicht funktioniert !

    An was liegt das ? Bzw. was macht diese Funktion eigentlich genau ?? Ein kurzer Blick auf www.cppreference.com bestätigt, dass die Funktion "clear ()", "ignore ()" usw. den Puffer löschen. Aber was genau geht da vor sich ?? Was bedeutet zum Beispiel diese Zeile ??:

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

    Mir ist aufgefallen, dass ziemlich viele selbstsicher diese Methode vorstellen, selbst in den FAQ's ist sie aufgeführt, aber keiner beschreibt, wie diese Funktion arbeitet, und was die einzelnen Parameter bedeuten. Letztendlich kann auch keiner eine konkrete Antwort auf ziox's Frage geben 😉 Ich würde mich trotzdem auf eine Erklärung freuen, da mich das Thema auch interessiert, und es nicht ganz unpeinlich ist, das mit knapp einem Jahr C++ Erfahrung immer noch nicht zu verstehen ...

    MfG mikey.



  • hi!

    Was ich auch wissen wollte, war ob hier jeder diese wait funktion benutzt, oder ob die Leute nur dünn gesäht sind?
    An irgendwas muss das ja liegen, sonst würden mehr Tutorials auf diesen Fehler hinweisen, allerdings kenne ich keines, dasdas Tut.Und auch in keiner Sourcefile wird das beschrieben.
    Ich besitze ca 3 c++ bücher, wobei aber in keinem diese Methode beschrieben wird.
    @Mikey: musst du auch eine solche wait funktion einbinden?

    grüße
    ziox.



  • Also ich benutze (wenn überhaupt) getch () um die Konsole geöffnet zu halten. Meinst du den Fehler, dass wait () nicht immer funktioniert, oder das kaum irgendwo erwähnt wird, dass das Fenster mit einer solchen Funktion geschloßen werden muss?

    Mfg Ominion



  • @Mikey: musst du auch eine solche wait funktion einbinden?

    Nur in ganz bestimmten Fällen, wenn ich z.B. eine Eingabe per getline () erwarte, davor muss der Eingabebuffer geleert werden ... Ansonsten sind in komplexeren Programmen immer irgendwelche Funktionen / Funktionsaufrufe ineinander verschachtelt, sodass es eigentlich nie zu einem Ende in diesem Sinne kommt. Wenn ich kleine Programme schreibe, und ich nicht möchte, dass sich das Konsolenfenster schließt, dann verwende ich meistens getchar (), nur befindet sich dann komischerweise nichts im Buffer, dass dann als Eingabe ausgewertet werden könnte ... Insofern ist diese wait () - Funktion nur bei so kleinen Programmen relevant. Noch was nebenbei: Du kennst doch sicherlich das Codesample "Jackpot", dort kommt es eig. auch nie zu einem Ende, sondern das Game läuft indirekt in einer Schleife, weswegen diese Methode entfällt !

    [EDIT]

    Also ich benutze (wenn überhaupt) getch () um die Konsole geöffnet zu halten.

    ich auch, wobei diese Methode nicht die vorbildlichste ist ...

    MfG mikey.



  • Ja Jackpot ist mir bekannt 😃

    Was empfehlt ihr mir, getchar() oder wait()??
    Was findet ihr besser, bzw zu was ratet ihr?

    grüße
    ziox.



  • Ja Jackpot ist mir bekannt

    Hrrrr, woher das wohl ... 😃

    Was empfehlt ihr mir, getchar() oder wait()??

    Also da sind wir ja an dem Problem angelangt, weswegen ich dir auch die wait () Funktion gegeben habe ... Generell ist getchar natürlich angebrachter, wobei es aber auch ganz klar den Nachteil mitsich bringt, dass es nicht immer hilft, da sich ja noch was im Eingabepuffer befinden könnte. Ich muss dir ganz ehrlich sagen, ich blicke bei dem bis heute noch nicht durch, und möchte dir auch keine großen Stories erzählen ...

    Also Faustregel: getchar ist vorzuziehen, und wenn das nicht klappt, dann nimm wait (); Alternativ dazu könntest du noch getch (); hernehmen, dazu musst du aber <conio.h> einbinden.

    MfG mikey.



  • hmmm er will doch das konsolenfenster offen bleibt, geht es dann nicht auch so ?
    oder hab ich etwas falsch verstanden 😞

    #include <iostream>
        using namespace std;
    
        int main()
        {
          int zahl1;
          int zahl2;
    
          cout << "Bitte eine Zahl eingeben" << endl;
          cin >> zahl1;
          cout << "Bitte noch eine Zahl eingeben" << endl;
          cin >> zahl2;
          cout << "Zahl 2: " << zahl2 << endl;
          cout << "Zahl 1: " << zahl1 << endl;
          [b]system("PAUSE");[/b]
          return 0;
        }
    


  • Wo kann ich denn(allgeein jetzt) nachsehen wie die Funktion getchar(); aussieht?
    Gibt es da eine Übersichtsseite hier im Forum oder so?
    Wäre nett wenn ihr mir das sagen könntet.

    Edit:

    hmmm er will doch das konsolenfenster offen bleibt, geht es dann nicht auch so ?
    oder hab ich etwas falsch verstanden

    Mit System("PAUSE"); geht es auch, allerdings hab ich schon öfters gehört und gelesen das das seh langsam sein soll.
    kP obs stimmt, deswegen frag ich ja hier 😃

    grüße
    ziox.



  • Die Funktion getchar () hat keine Parameter, falls du das meinst.

    Mfg Ominion



  • Ich weiß zwar nicht, was an obiger Codezeile so mysteriös ist, aber ich werd' versuchen, etwas Licht in die Sache zu bringen.

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

    Okay, gehen wir's von innen an. cin.rdbuf() liefert ein stringbuf* zurück. Dieses hat die (von streambuf geerbte) Methode in_avail() welche die Anzahl der Zeichen im Stream zurückgibt. Gut, eigentlich geht in_avail hin schaut erstmal, ob der Pointer auf das nächste zu lesende Element kleiner als der Pointer ist, der hinter das letzte Element des Streams zeigt. Wenn dem so ist, subtrahiert es die Position vom nächsten Element von der Position des Elements "hinter dem Ende des Streams" ( egptr() - gptr() ). Ansonsten wird showmanyc aufgerufen, welches per default null zurückgibt.

    ignore hingegen holt n Zeichen aus dem Stream und verwirft sie. Der Stream ist in dem Fall cin und n ist der Wert, den wir von in_avail() bekommen. Also die Anzahl der Zeichen, die momentan im Stream lesbar sind.

    Ach ja, wait ist klar besser, da man getchar ziemlich leicht überlisten kann, wenn zwei Sachen im Buffer stecken. Und von getch lässt man die Finger, weil die conio.h nicht überall vorhanden ist (hängt vom Compiler ab).

    MfG

    GPC


Anmelden zum Antworten