Merkwürdiger Laufzeitfehler
-
Guten Abend,
ich lese momentan das C++ Language Tutorial von Juan Soulie und bin gerade beim Thema "Jump statements", genauer gesagt bei "break". Das entsprechende Beispiel dazu lässt sich mit Hilfe von Visual Studio 2008 Express auch ohne Probleme kompilieren. Fehlermeldungen und Warnungen werden nicht angezeigt. Wenn man das kleine Programm per Eingabeaufforderung auführt, wird allerdings kein Text ausgegeben und ich kann mir absolut nicht erklären, weshalb das nun so ist.
Der folgende Quelltext muss ja korrekt sein?
// break loop example #include <iostream> using namespace std; int main() { int n; for (n = 10; n > 0; n--) { cout << n << ", "; if (n == 3) { cout << "countdown aborted!"; break; } } return 0; }Erwartete Ausgabe:
10, 9, 8, 7, 6, 5, 4, 3, countdown aborted!
Es wäre klasse, wenn mich jemand aufklären könnte.
-
Liegt daran, dass die Konsole sich wieder schließt...
die 2 häufigsten Alternativen:
- die einfachste, aber unportable (nur Windows):system("PAUSE")(#include <cstdlib>) - sollte nur zu Testzwecken genutzt werden
- diese 3 Zeilen:std::cin.clear(); std::cin.ignore( std::cin.rdbuf()->in_avail() ); std::cin.get();Irgendwo gabs da auch ma nen FAQ-Eintrag (schließen der konsole verhindern oder so), aber ich hab ihn jetzt nicht auf die schnelle gefunden... ^^
bb
-
FAQ schrieb:
2. Wenn ich mein Programm ausführe, passiert gar nichts/flackert nur kurz was auf! Wieso?
Schau mal in der Konsolen-FAQ in den Thread Automatisches Schließen verhindern. Desweiteren gibts es (kostenlose) IDEs, die das Problem von selbst lösen. Als Beispiele seien Code::Blocks und Visual C++ 2005 Express Edition genannt.
Eine dritte Methode ist das Erstellen einer Batch-Datei, die das eigentliche Programm aufruft. Das geht unter Windows folgendermaßen:
1. Im Explorer (also der ganz normale Datei-Browser) im Menü auf Extras -> Ordneroptionen.
2. Dann auf "Ansicht" und bei "Erweiterte Einstellungen" den Haken bei "Erweiterung bei bekannten Dateitypen ausblenden" entfernen.
3. OK
4. Datei -> Neu -> Textdokument
5. Einen Namen, der mit ".bat" endet, eingeben, wie z.B. "Starter.bat"
6. Rechtsklick auf die bat-Datei und Bearbeiten auswählen.
7. Im Editor folgendes eingeben:
Code:
meinprogramm.exe
pause
Code:
meinprogramm.exe
pause
Code:
meinprogramm.exe
pauseFür "meinprogramm" den Namen des Programms eingeben.
8. Datei speichern und Editor beenden.
9. Doppelklick auf die bat-Datei und das Programm bleibt danach offen!Als vierte Möglichkeit sei "Open Command Window Here" aus den Windows XP Powertoys genannt. Mit diesem öffnet man schnell eine Konsole in dem gewünschten Verzeichnis und braucht nur noch den Programmnamen einzugeben. Anders als bei den vorherigen Lösungen beendet sich das eigene Programm zwar, die Ausgabe bleibt aber dennoch sichtbar, da die Konsole ja nicht geschlossen wird.
Eine weitere Möglichkeit wäre noch getch().
#include <iostream> #include <conio.h> int main() { std::cout << "Hallo C++ Community!"; getch(); }Wobei getch() glaube ich eine plattformabhängige Methode ist, was aber wesentlicher besser als system("pause") ist.
-
@0x58:
Da du ja Visual Studio verwendest, kannst du auch folgendes machen:
In der Menüleiste gehst du auf Debuggen -> Starten ohne Debugging oder du verwendest alternativ die Tastenkombination STRG + F5. Dadurch bleibt die Konsole bei der Ausführung des Programms aus Visual Studio heraus ebenfalls geöffnet.
-
Ups, ich hätte mich deutlicher Ausdrücken sollen - Entschuldigung. Ich habe mir unter Program Files einen Ordner angelegt, in welchem ich alle kompilierten Programme abspeichere und habe die PATH Umgebungsvariable entsprechend angepasst, sodass ich in einem geöffneten Eingabeanforderungsfenster einfach nur noch den Namen des entsprechenden Programmes eingeben muss und dieses dann eben ohne ein im Anschluss stattfindendes Schließen des Konsolenfensters ausgeführt wird.
Merkwürdiger Weise ist die einzig ersichtliche Ausgabe des oben gezeigten Codes nur ein line break, mehr nicht.
-
Das Programm funktioniert 1a
.
Du machst irgendwas falsch.
-
Die vorhergehendenen Beispiele haben bei mir auch noch alle funktioniert und ich habe die "Produktionsmethode" nicht geändert. Jetzt bin ich ganz baff. Naja, ich werde mal einfach ein neues Konsolenprojekt starten, den exakt gleichen Code verwenden und mal schauen, was passiert.
EDIT: Ich denke, ich darf mich mal ganz schnell in die Ecke stellen. Der Grund war die Benennung des Programmes. "break" war der Name und das wird von der Konsole ja völlig anders interpretiert...