C++ Programm soll sich nicht sofort schließen!



  • 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 nun system benutzt 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.


  • Mod

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



  • _matze schrieb:

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

    Hä??
    Wo ist der Nachteil?
    Außerdem ist Strg+F5/F5 nicht Debug/Release, sondern Ohne-Debugger-Starten/Mit-Debugger-Starten.
    system("pause") sorgt zum Beispiel dafür, daß ich das vom TO so nett gemachte fertige Testprogrämmchen nicht unrter Linux testen kann. Also lasse ich es. Wenn er nichtmal diese Grundhöflichkeit hat, soll ihm doch jemand anderer helfen.



  • _matze schrieb:

    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?

    Einen Haltepunkt auf das return in main() setzen...


Anmelden zum Antworten