Konsole schließt sich trotz [...] cin.get();
-
Normalerweise verhindere ich das sofortige Schließen der Konsole erfolgreich mit
cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get();
Komischerweise klappt das bei einigen meiner letzten Files nicht.
(Ich sehe aber auch bei denen (, wo es nicht klappt, ) keinen Unterschied zu den Programmen, wo es klappt.)
Als Beispiel für ein Versagen des obigen Codes dieses einfache "Programm":#include <iostream> #include <windows.h> using namespace std; int main(void) { int tonhoehe; int dauer; cout << "Welche Tonh\x94he (MHz) soll ausgegeben werden? "; cin >> tonhoehe; cout << "Wie lange (MilliSec) soll der Ton ausggeben werden? "; cin >> dauer; cout << endl << "PLAY"; Beep(tonhoehe, dauer); cout << " - STOP"; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); return 0; }
Nun Schließt sich die Konsole komischerweise direkt nach dem "Beep". Das heißt, wahrscheinlich wird das "STOP" schon noch ausgegeben, aber durch das sofortige Schließen ist es eben nicht mehr sichtbar.
Was mache ich falsch?
-
Also bei mir funktioniert alles tiptop, versuch's doch einfach nochmals.
-
mach vor dem get mal ein
cin.sync ();
-
Nochmaliges Abtippen hat leider nichts genützt.
Aber das hier:C++ Kenner schrieb:
mach vor dem get mal ein
cin.sync ();Wenn ich dann noch fragen dürfte: Wieso muss ich das hier schreiben?/Wieso kann ich es woanders weglassen? Was bewirkt "cin.sync();"?
(@ goto anywhere;: Welchen Compiler nutz du denn? Kann es vielliecht damit zu tun haben, dass ich MinGW(gcc) und du einen anderen benutzt?)
-
Ich hab's in "Microsoft Visual C++ 2005 Express Edition" eingegeben.
(Dein Programm funktioniert vielleicht auch wunschgemäss, wenn du's nicht aus der IDE startest sondern ganz normal.)
-
goto anywhere; schrieb:
(Dein Programm funktioniert vielleicht auch wunschgemäss, wenn du's nicht aus der IDE startest sondern ganz normal.)
Leider nicht.
-
Also ich hab mir jetzt nochmal den Borland Compiler installiert und das ganze mit ihm probiert. Hier klappt es auch ohne Fehler.
Weiß einer, wieso dieser Fehler bei MinGW auftritt?
Und darf ich mich nochmal zitieren?.m schrieb:
Wieso muss ich das hier schreiben?/Wieso kann ich es woanders weglassen? Was bewirkt "cin.sync();"?
Das was ich über Google gefunden haben, hat mir da nicht so wirklich weitergeholfen...
-
Nun Schließt sich die Konsole komischerweise direkt nach dem "Beep". Das heißt, wahrscheinlich wird das "STOP" schon noch ausgegeben, aber durch das sofortige Schließen ist es eben nicht mehr sichtbar.
Was mache ich falsch?Hätte da eine Idee, die das Programm immer weiter laufen lassen könnte.
Und zwar der nette befehl getch(). So siehts aus :#include <iostream> #include <windows.h> #include <conio.h> using namespace std; int main(void) { int tonhoehe; int dauer; cout << "Welche Tonh\x94he (MHz) soll ausgegeben werden? "; cin >> tonhoehe; cout << "Wie lange (MilliSec) soll der Ton ausggeben werden? "; cin >> dauer; cout << endl << "PLAY"; Beep(tonhoehe, dauer); cout << " - STOP"; cin.clear(); cin.ignore(cin.rdbuf()->in_avail()); cin.get(); getch(); return 0; }
So funktioniert es bei mir perfekt !
-
Aber bewirkt den getch() nicht einfach das Gleiche*1 wie cin.get()? So habe ich es zumindest unter http://www.c-plusplus.net/forum/viewtopic-var-t-is-111042.html verstanden. Dann wäre der Code doch "doppelt gemoppelt"?
*1 Ist zwar unterschiedlich, jedoch werden sie doch beide u.a. benutzt um die Konsole geöffnet zu lassen.
P.S.: Weiterhin die Fragen wieso ich hier cin.sync() verwende(n muss) und was das genau bewirkt.
-
Mhm. Das ist Interessant. Aber du kannst cin.get() auch einfach weg machen.
Funzt bei dir wohl nicht.
-
pivke schrieb:
Aber du kannst cin.get() auch einfach weg machen.
Ach so, ja. Da hast du natürlich Recht.
Vielen Dank für die ganzen Antworten!
Nochmal zusammenfassend könnte ich also- einen anderen Compiler verwenden
- getch() anstatt cin.get() benutzen
- oder cin.sync() einfügen (wobei ich immer nocht nicht weiß, was das hier bewirkt (und ggf warum ich es nur hier einsetzen muss)
-
einen anderen Compiler verwenden
Ja, muss halt einer sein der Das Codeformat C++ unterstützt.
Das wären beispielsweise :
Dev-C++
MinGW Studio
Visual Studio C++getch() anstatt cin.get() benutzen
Jap.
oder cin.sync() einfügen (wobei ich immer nocht nicht weiß, was das hier bewirkt (und ggf warum ich es nur hier einsetzen muss)
Der Eingabestrom wird synchronisiert, der Ausgabestrom nicht. D.h. der interne Puffer wird mit den eingegebenen Zeichen synchronisiert und überzählige werden somit verworfen.
-
Dev-C++ benutzt den MinGW Compiler. Außerdem hatte ich ja gereade mit diesem Compiler das Problem.
Zu cin.get(): Warum brauche ich dass denn hier (bei diesem Programm), wenn ich cin.get() benutzen will? Ansonsten gehts doch auch ohne...
-
Zu cin.get(): Warum brauche ich dass denn hier (bei diesem Programm), wenn ich cin.get() benutzen will? Ansonsten gehts doch auch ohne...
Ja wer sagt denn das du cin.get() benutzen sollst ? Machs einfach mit getch() und fertig.
Dev-C++ benutzt den MinGW Compiler.
Schon klar, es gibt aber auch eine Software die MinGW Studio heisst. Weiss jetzt aber nicht was sie für einen Compiler hat.
-
Irgendwie habe ich es immer mit cin.get() gemacht. Aber das ist ja eigentlich auch egal. Mich interessiert es aber, warum ich dieses cin.sync() brauche, weil ich wissen will, warum es ohne bei diesem Code (ansonsten ja schon) nicht klappt und was es da macht...
-
Irgendwie habe ich es immer mit cin.get() gemacht. Aber das ist ja eigentlich auch egal. Mich interessiert es aber, warum ich dieses cin.sync() brauche, weil ich wissen will, warum es ohne bei diesem Code (ansonsten ja schon) nicht klappt und was es da macht...
Wieso ? Wer sagt denn das du es brauchst ? :p
Bei mir zum Beispiel geht es völlig ohne :#include <iostream> #include <windows.h> #include <conio.h> using namespace std; int main(void) { int tonhoehe; int dauer; cout << "Welche Tonh\x94he (MHz) soll ausgegeben werden? "; cin >> tonhoehe; cout << "Wie lange (MilliSec) soll der Ton ausggeben werden? "; cin >> dauer; cout << endl << "PLAY"; Beep(tonhoehe, dauer); cout << " - STOP"; getch(); return 0; }
-
Ich brauche es nur wenn ich cin.get() benutze. Und dann auch nur bei diesem Code. Sicher ich könnte auch was anderes als cin.get() benutzen. Aber ich wollte ja am Anfang des Threads wissen, warum es auf einmal nicht mehr klappt. Jetzt ist eine Lösung mit cin.sync(). Und jetzt würde mich eben nur noch interessieren, warum ich es außer bei diesem Beispiel nie brauche bzw. wozu es hier nötig ist und was es genau (in diesem Code) macht.
-
Ich brauche es nur wenn ich cin.get() benutze. Und dann auch nur bei diesem Code. Sicher ich könnte auch was anderes als cin.get() benutzen. Aber ich wollte ja am Anfang des Threads wissen, warum es auf einmal nicht mehr klappt. Jetzt ist eine Lösung mit cin.sync(). Und jetzt würde mich eben nur noch interessieren, warum ich es außer bei diesem Beispiel nie brauche bzw. wozu es hier nötig ist und was es genau (in diesem Code) macht.
Es klingt so, als wüsstest du nicht einmal was die Befehle genau machen !
Sry, aber so erscheint es mir.
-
(Falls ich mich in meinem letzten Post unklar ausgedrückt habe: sorry!)
Ich weiß was die Befehle bewirken. Sonst hätte ich sie ja nicht schon die ganze Zeit benutzt. Das einzige was ich nicht weiß und was ich seit ungefähr 6 Posts noch unter diesem Thread wissen will ist, wieso ich bei diesem Code noch zusätzlich ein cin.sync() brauche (Siehe hierzu auch meine Zusammenfassung).
Und auch wenn du mir noch öfter sagst, dass ich auch einfach getch() verwenden kann, will ich eigentlich nur noch das mit dem cin.sync() wissen. Nicht mehr und nicht weniger.Im Grund hat pivke das ja schon mal angefangen zu erklären: Der Eingabestrom wird synchronisiert, der Ausgabestrom nicht. D.h. der interne Puffer wird mit den eingegebenen Zeichen synchronisiert und überzählige werden somit verworfen.
Ich weiß nur nicht, warum das eben in diesem Code nötig ist, während ich das in den übrigen Programmen vernachlässigen konnte.
-
.m schrieb:
...
Dev-C++ wird schon lange nicht mehr weiterentwickelt. Ich würde dir dringend raten einen aktuellen Compiler heranzuziehen.
-
Dev-C++ wird schon lange nicht mehr weiterentwickelt. Ich würde dir dringend raten einen aktuellen Compiler heranzuziehen.
Sollte aber für Win32-Konsolenanwendungen reichen. Einer der aktuellsten Compiler ist Visual Studio 2008.