JLI Spieleprogrammierung Foren-Übersicht JLI Spieleprogrammierung

 
 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen 
 medals.php?sid=298853adf1812e81fc23d1a37892f0afMedaillen   RegistrierenRegistrieren   ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 

[C++] Konsolenprogramm beendet sich (vorzeitig)

 
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
The Lord of Programming
Living Legend


Alter: 36
Anmeldedatum: 14.03.2003
Beiträge: 3122

Medaillen: Keine

BeitragVerfasst am: 09.09.2007, 23:40    Titel: [C++] Konsolenprogramm beendet sich (vorzeitig) Antworten mit Zitat

Frage:

Ich habe eine Konsolenanwendung programmiert, die bisher immer korrekt funktioniert hat, wenn ich sie direkt nach dem Kompilieren aus Visual Studio/code::blocks gestartet habe. Öffne ich allerdings die im Ordner "Debug" oder "Release" erstellte *.exe, so beendet sich das Programm bevor ich alle Ausgaben(idR. std::cout) zu Gesicht bekommen habe.

Was kann ich tun? Ich bin so verzweifelt. Confused

Antwort:

Viele IDEs nehmen hierbei dem Programmierer Arbeit ab und vereinfachen die Fehlersuche. Sie haben einen eingebauten Mechanismus, der verhindert, dass ein Konsolenprogramm beendet wird, bevor der Programmierer alle Ausgaben zu Gesicht bekommen hat.

Gegeben sei folgendes Programm:
CPP:
#include <iostream>

int main(void)
{
   std::string name;

   //Ausgabe
   std::cout<<"Bitte Namen eingeben: "<<std::endl;

   //Name einlesen
   std::cin>>name;

   //Begrüßung ausgeben
   std::cout<<"Hallo, "<<name<<"!";

   return 0;
}


Da der Computer über eine maschinelle Intelligenz verfügt, wird er das Programm Zeile für Zeile ausführen.
Er wird ausgeben: "Bitte Namen eingeben: ", den Namen einlesen und anschließend die Begrüßung "Hallo, Name!" ausgeben. Anschließend wird das Programm sofort beendet, da es "am Schluss angekommen ist". Von der Begrüßung ist logischerweise nicht viel zu sehen.

Der Mechanismus vieler IDEs verhindert dies, indem nach der Ausgabe von "Drücken Sie eine beliebige Taste..."(o.ä.) auf Tastendruck gewartet wird. So hat der Programmierer die Möglichkeit, die letzte Ausgabe so lange stehen zu lassen, bis er sie nicht mehr benötigt. Diesen "Service" kann die IDE allerdings nur zur Verfügung stellen, solange das Programm auch tatsächlich aus der IDE gestartet wird.
Der eigentliche Zweck einer Konsolenanwendung besteht eigentlich darin, sie auch aus einer Konsole zu starten. Öffnet man die Eingabeaufforderung und öffnet sein Programm von dort aus, wird sich die Konsole nicht freiwillig beenden. Dies tut sie nur, wenn die Konsole allein aus dem Grund, das Programm auszuführen gestartet wird.


Abhilfe kann dem geschaffen werden, indem eine zusätzliche Tastaturabfrage am Ende des Programms eingefügt wird.
Dafür gibt es folgende Möglichkeiten:

  • std::cin.get()(die wohl eleganteste Methode)
    An das Ende des Programms wird folgender Code angehängt, der auf die Betätigung der Enter-Taste wartet (mit oder ohne vorherige Eingabe):
    CPP:
       //[...]
       std::cin.sync();
       std::cin.get();

       return 0;
    }

  • std::getchar()
    Selbe Wirkung...
    CPP:
       //[...]
       std::cin.sync();
       std::getchar();

       return 0;
    }

  • std::gets()
    Selbe Wirkung, aber veraltet...
    CPP:
       //[...]
       char buffer[50];
       std::cin.sync();
       std::gets(buffer);

       return 0;
    }

  • std::cin
    Hier wird einfach eine weitere Eingabeaufforderung erstellt:
    CPP:
       //[...]
       std::string close;
       std::cin>>close;

       return 0;
    }

  • getch()
    Achtung: Header conio.h wird benötigt.
    getch() wartet auf einen beliebigen Tastendruck.
    CPP:
       //[...]
       getch();

       return 0;
    }

  • system()
    Gibt eine Meldung in der Art "Drücken Sie eine beliebige Taste..." aus und wartet auf Tastendruck.
    CPP:
       //[...]
       system("pause");

       return 0;
    }

_________________
www.visualgamesentertainment.net
Current projects: RDTDC(1), JLI-Vor-Projekt, Tetris(-Tutorial), JLI-Format
(1) Realtime Developer Testing and Debugging Console


Anschlag, Anleitung zum Atombombenbau, Sprengkörper...
Hilf Schäuble! Damit er auch was findet...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    JLI Spieleprogrammierung Foren-Übersicht -> FAQ Alle Zeiten sind GMT
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.


Powered by phpBB © 2001, 2005 phpBB Group
Deutsche Übersetzung von phpBB.de

Impressum