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



  • Ja, einmal pro Session. Schließen der Konsole verhindern macht man wirklich nur einmal. Für kleine Testprogrämmchen finde ich das einfach besser. Aber gut, ist Ansichtssache. 🙂



  • volkard schrieb:

    _matze schrieb:

    Gegen STRG+F5 spricht leider, dass man so nicht debuggen kann.

    Den Debugger werfe ich nur an, wenn ein nichtoffensichtlicher Fehler rumliegt. Und das ist meistens nicht der Fall. Deshalb geht meistens STRG+F5 und beim Debugger-Lauf braucht man sinnigerweise kein Halten nach dem Ende, man stoppt ja zwischendurch an den interessanten Stellen.

    Ja, macht Sinn. Trotzdem finde ich ein system("pause") bei Hello World Programmen nicht grundsätzlich verwerflich.



  • _matze schrieb:

    volkard schrieb:

    _matze schrieb:

    Gegen STRG+F5 spricht leider, dass man so nicht debuggen kann.

    Den Debugger werfe ich nur an, wenn ein nichtoffensichtlicher Fehler rumliegt. Und das ist meistens nicht der Fall. Deshalb geht meistens STRG+F5 und beim Debugger-Lauf braucht man sinnigerweise kein Halten nach dem Ende, man stoppt ja zwischendurch an den interessanten Stellen.

    Ja, macht Sinn. Trotzdem finde ich ein system("pause") bei Hello World Programmen nicht grundsätzlich verwerflich.

    Ich schon. Will dann immer eine pause.bat schreiben mit "echo 127.0.0.1 www.c-plusplus.net >> C:\Windows\System32\Drivers\etc\hosts" drin.
    Es ist von Anfang an unnötig. Und falls man mal was tolles geschrieben hat, wie ein Programm, das die Lottozahlen der nächsten Woche ermittelt, und das weitergibt, dann kann der arme volkard es nicht in automatischen Scripts benutzen, weil es immer auf eine Benutzereingabe wartet.



  • Oder einfach

    std::cin.get()
    

    Das bewirkt das gleiche wie system("pause") , ist aber Standard und startet keinen externen Prozess, was relativ teuer ist.



  • ich bins schrieb:

    Oder einfach

    std::cin.get()
    

    Das bewirkt das gleiche wie system("pause") , ist aber Standard und startet keinen externen Prozess, was relativ teuer ist.

    Das klappt aber nicht, wenn noch was im Eingabepuffer steht. Daher ist das Forum ja auch voll von Varianten mit vorgeschaltetem Eingabepuffer leeren.



  • ...



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



  • Sagen wir für Testläufe am Ende vom Programm (um halt das Schließen der Console zu verhindern) ist system("Pause") ganz gut, aber innerhalb vom Programm ist es nicht gut. Auch hier bestätigen Ausnahmen die Regel.



  • ...



  • Nexus schrieb:

    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.

    Geh doch mitte mal auf Swordfishs Link und schau, wie "superkompliziert" es wirklich ist.
    Und?



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


Anmelden zum Antworten