Abruptes Ende bei Konsolenanwendung!



  • Hi,
    ich habe neulich ein Programm geschrieben, dass allerlei physikalische und mathematische Berechnungen durchführt, doch wenn das Programm das Ergebnis ausgibt beendet das Programm sofort, ohne dass die Meldung Press any Key to continue kommt. Eigentlich habe ich aber am Ende jeder Berechnungsfunktion die main aufgerufen (main();), sodass man erneut eine Berechnung auswählen kann, aber es funktioniert nicht, wie ändere ich das? Muss die Berechnungsfunktion einen bestimmten Wert an main liefern?



  • Übrigens das noch so nebenbei:

    Das passiert nur wenn ich die Datei selbst per Doppelklick starte, unter MSVCPP geht es wenn ich auf ausführen drücke einwandfrei!



  • Ach, ich liebe die FAQ und es wäre schön, wenn andere auch reingucken würden oder wenigstens die Suche benutzen würden, weil das mindestens jede Woche gefragt wird: http://www.c-plusplus.net/forum/viewtopic.php?t=39328



  • Übrigens: Ich glaube kaum, dass man laut Standard die main-Funktion aufrufen darf.



  • Das habe ich mir schon angeguckt, ich verstehe es aber nicht!
    Gibt es da nicht einen einfacheren weg? Ich will mein Programm ja verstehen und es bringt wenig wenn ich das da nur einfach da reinschreibe ohne zu wissen was es tut.



  • In den meisten Fällen reicht ein getch() aus.



  • Ist doch logisch 😃

    Du löscht zuerst alle Fehlerbits die vorhanden sein könnten:

    cin.clear()

    Danach gibts du die Anweisung an den Stream Zeichen zu ignorieren, als Parameter übergibst du die Anzahl - du willst soviele Zeichen ignorieren wie vorhanden sind -> cin.rdbuf() -> in_avail()

    Danach ist der Puffer leer und du kannst beruhigt ein Zeichen einlesen - mit getch() bzw. wenn nur ein Enter zählen soll: cin.get().

    Einfach nur getch() funktioniert oft, aber eben nicht wenn der Puffer nicht leer ist.

    MfG SideWinder



  • Aha, aber ich weiss nichtmal was ein Puffer ist.
    Es reicht also ein getch() ans ende zu schreiben?



  • Wie gesagt: Es reicht oft, aber nicht immer. Ich würde mich nicht darauf verlassen sondern am Ende folgenden Code benützen:

    // a) Reine Win-Variante
    #include <conio.h>
    #include <windows.h>
    
    ...
    
    FlushConsoleInputBuffer(GetStdHandle(STD_INPUT_HANDLE));
    getch();
    
    // b) Standard-Variante (wartet allerdings auf ein Enter)
    #include <iostream>
    using namespace std;
    
    ...
    
    cin.clear ();
    cin.ignore (cin.rdbuf()->in_avail());
    cin.get();
    

    Zum Thema Puffer: Alle Zeichen die du ausgibst werden nicht direkt in die Konsole geschrieben sondern zuerst in einem Puffer zwischengespeichert der bei Bedarf auf die Konsole geschrieben wird (zB bei endl oder flush).

    Das selbe ist beim Input, willst du genau 1 Zeichen eingeben lassen und der User gibt bei cin allerdings 5 ein und drückt erst dann Enter werden die restlichen 4 in eine Puffer zwischengespeichert. Lässt du nun am Ende ein Zeichen eingeben nimmt er zuerst eins aus dem Puffer falls vorhanden - wenn das der Fall ist beendet dein Programm allerdings sofort und die Ausgabe bekommst du nicht zu sehen.

    Also vorher Puffer löschen.

    MfG SideWinder



  • es geht auch mit 'system("pause");'. Must aber auf MS-Windows laufen und am ende kommt "Weiter mit beliebiger Taste..." herraus.... ist leichter...
    Daniel



  • kill 'em

    1. Ist die system()-Funktion sehr abhängig von der verwendeten Konsole (könnte in jeder Windowsversion anders reagieren)

    2. Ist die system()-Funktion äußerst langsam da der Befehl von der Konsole verarbeitet wird

    3. Kriegt man von SideWinder für die Verwendung der system()-Funktion Prügel :p

    Also niemals nie system("pause") verwenden 😉

    MfG SideWinder



  • @Daniil
    Man eine Tür öffnen indem man den Schlüssel dazu benutzt. Oder man kann sie auch aufsprengen, was deinem Vorschlag mit system() gleich kommt.



  • AJ schrieb:

    @Daniil
    Man eine Tür öffnen indem man den Schlüssel dazu benutzt. Oder man kann sie auch aufsprengen, was deinem Vorschlag mit system() gleich kommt.

    Manche Leute wollens einfach nicht lernen 😞

    MfG SideWinder



  • SideWinder schrieb:

    Manche Leute wollens einfach nicht lernen 😞

    MfG SideWinder

    Ja und dann genau die Leute, die noch hoch hinaus wollen. 🙄



  • AJ schrieb:

    SideWinder schrieb:

    Manche Leute wollens einfach nicht lernen 😞

    MfG SideWinder

    Ja und dann genau die Leute, die noch hoch hinaus wollen. 🙄

    *g*, stell dir vor du benützt für dein neues OS system("pause") und implementierst zwar system() aber vergisst auf pause... 😃

    MfG SideWinder


Anmelden zum Antworten