C++ Programm soll sich nicht sofort schließen!
-
Nexus schrieb:
ich bins schrieb:
und startet keinen externen Prozess, was relativ teuer ist.
Und wie wir wissen, ist Performance immer da am relevantesten, wo das Programm auf den Benutzer wartet

Im Ernst: Der Versuch, sowas wie
system("pause")mit IO-Streams zu erreichen, artet in super-komplizierten Code aus und reagiert doch nur auf die Enter-Taste.Ich dachte, auch ein PC könnte mehrere Sachen gleichzeitig erledigen. Ich habe mal was von Multitasking gehört. Wenn es das wirklich gäbe, dann sollte doch auch das Vordergrundprogramm nicht unnötig Ressourcen verschwenden.
Ganz abgesehen davon, dass ich mir angewöhnt habe, mit Ressourcen immer sparsam umzugehen. Aber wenn das nicht nötig ist und auch die Plattformunabhängigkeit auch so was von gestern ist, dann sollte ich mir das nochmal überlegen.
-
Der Link von Swordfish bestätigt mich nur. Es braucht einen ganzen Post, um die halbwegs äquivalente Funktionalität mit Standard-C++ zu erklären, und die verschiedenen Varianten verwirren nur. Für einen Anfänger sind die 3 Zeilen tatsächlich kompliziert, er muss sie entweder auswendig lernen oder ständig einen Header mitschleppen -- aber er wird den Code nicht verstehen, ohne gute Kenntnisse über IO-Streams zu haben. Und doch kann man nur auf Enter reagieren.
Wir reden hier nicht von Produktivcode, sondern von kleinen Testprogrammen, bei denen die Konsole offen bleiben soll. Unter Linux befinden sich die Leute tendenziell sowieso schon in der Konsole, da stellt sich das Problem weniger.
Trotzdem interessant, wie mein Post zu "Ressourcen und Plattformunabhängigkeit sind irrelevant" generalisiert wird

-
system("pause")funktioniert ganz einfach für Windows-Programmier-Anfänger. Es ist simpel und sofort verständlich.
Bei allem Verständnis für den Anspruch, immer sauber und portabel zu programmieren: Ist es wirklich sinnvoll, sich darüber zu mokieren, dass ein Newbie da nunsystembenutzt statt mit Streams rumzuhampeln, bei denen er weder verstehen kann, was das alles soll, noch irgendeinen Mehrwert davon hätte? Muss denn sein Hallo Welt! wirklich portabel sein, oder will er einfach bloß seine Ausgabe sehen?Edit: Ah, zwischendurch mal weggewesen. Wollte Nexus' Post nicht wiederholen.
-
...
-
Danke Swordfish.
std::cin.get() funktioniert auch für Anfänger. Und ist besser, als system("pause"). Nach dem "Hello World" kommt dann eh recht bald das std::cin. Für Produktivcode muss man dann auch noch den Puffer leeren und so weiter. Eigentlich müsste man ja bei system("pause") auch den Fehlercode prüfen, ob das erfolgreich war.
-
Ich bleibe dabei:
Startet ein Konsolenprogramm aus einer Konsole, dann erübrigt sich sämtliche Trickserei im Programm.
-
Warumt macht ihr es nicht über die conio.h?
#include <conio.h> using namespace std; int main() { //(…) getch(); return 0; }0x0ERROR
-
...
-
Swordfish schrieb:
Ich geb' auf und empfehl' ab heute einfach [Makros]
Igitt. Das verwirrt nur die Anfänger.
Ich empfähle:
bool pause() { using namespace std; // system() must either be in std:: or in global namespace // Swordfish relies on having both, ::system() and std::system() return !system(0) && !(system("pause") || system("read -n1 -r -p \"Press any key to continue...\"")) || nearly_as_good_as_pause(); }(ungetestet, vielleicht habe ich die Bedingung etwas durcheinander gebracht)
-
ich bins schrieb:
std::cin.get() funktioniert auch für Anfänger.
Das macht was anderes als system("pause"). Und braucht mehr unverständlichen Code, um verlässlich zu funktionieren. Darum geht's ja gerade.
Eigentlich müsste man ja bei system("pause") auch den Fehlercode prüfen, ob das erfolgreich war.
Ähm... was? Wieso? Soll man dann auf andere Art auf eine Taste warten?
Swordfish schrieb:
Ich geb' auf und empfehl' ab heute einfach
Ja, das ist total raffiniert.
Das macht den Newbie froh.
-
Es funktionier auch, am Ende der main() cin.get() zu schreiben und für den Fall, daß das Programm Eingaben verlangte, und deswegen ein '\n' noch rumgammelt, schreibt man ein zweites cin.get() hin.
-
...
-
Belli schrieb:
Ich bleibe dabei:
Startet ein Konsolenprogramm aus einer Konsole, dann erübrigt sich sämtliche Trickserei im Programm.+1

Das eigentliche Problem ist nicht, wie man das Programm am besten daran hindert, zu beenden. Das Problem ist, dass überhaupt darüber nachgedacht wird, das Programm daran zu hindern, sich zu beenden, wenn es beenden sollte.
Setz in deiner IDE einen Breakpoint auf das return in main() und fertig.
-
markaber schrieb:
bool pause() { using namespace std; // system() must either be in std:: or in global namespace // Swordfish relies on having both, ::system() and std::system()Actually system must be in namespace std (or a namespace nested in std), but may also be found in the global namespace.
-
dot schrieb:
Setz in deiner IDE einen Breakpoint auf das return in main() und fertig.
Genau. Und dann möchte ich im Release-Build auch mal die Ausgabe sehen, bevor sich die Konsole schließt. was mach ich dann? Die Projekteinstellungen für Release anpassen?

-
Man muss bei VS einfach nur das Projekt als "Konsolenapplikation" linken (unter System->Subsystem) und strg+f5 drücken. (Andere IDEs haben das "Problem" glaube ich nicht mal?)
-
cooky451 schrieb:
Man muss bei VS einfach nur das Projekt als "Konsolenapplikation" linken (unter System->Subsystem) und strg+f5 drücken. (Andere IDEs haben das "Problem" glaube ich nicht mal?)
Hatten wir schon. Mein Gegenargument: damit kannst du nicht debuggen. Du musst also ständig zwischen verschiedenen Methoden wechseln.
-
Also ich debugge meist mit Haltepunkten. Hat den Vorteil, dass die Applikation sich so lange nicht beendet, wie ich das will

Die ganz Verrückten setzen sich ne wartende Semaphore vor das Return

-
_matze schrieb:
Hatten wir schon. Mein Gegenargument: damit kannst du nicht debuggen. Du musst also ständig zwischen verschiedenen Methoden wechseln.
Dass man damit nicht debuggt, ist doch der Sinn. Da verstehe ich das Argument nicht.
Man will nicht debuggen -> lässt das Programm durch laufen, oder man will debuggen -> wird ja irgendwo in den Sourcecode geschmissen.
-
Ok, andersrum: wo ist bei kleinen Testprogrämmchen der Vorteil der STRG+F5/F5-Wechsel-Methode zu einem simplen system("pause") am Ende? Ich sehe keinen (ich sehe sogar kleine Nachteile), außer dass ich mir von euch nicht anhören muss, wie böse und nicht portabel system ist, was mir bei einem nicht-produktiven Testprojekt so ziemlich scheißegal ist.
