The Lord of Programming Living Legend
Alter: 37 Anmeldedatum: 14.03.2003 Beiträge: 3122
Medaillen: Keine
|
Verfasst am: 10.09.2007, 00:40 Titel: [C++] Konsolenprogramm beendet sich (vorzeitig) |
|
|
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.
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... |
|