Hallo!
Ich bin relativ neu in C++ und habe das Problem dass mir Windows XP jedes (aus nagelneuem Lehrbuch stammend - erschienen 09/04) Konsolenprogramm nach der ersten Eingabe des Users mit dem bestätigen durch die [ENTER] Taste schließt.
Jetzt wollte ich fragen - muss ich in WinXP auf irgendetwas besonders achten?
Als IDE benutz ich Dev-C++ mit mitgeliefertem Compiler.
Danke für eure Hilfe!
Consolenprogramm bricht in WinXP ab
-
iveo -
24. September 2004 um 18:44 -
Unerledigt
-
-
ich kann mir vorstellen, dass das daran liegen könnte, dass du nach der letzten eingabe keine weitere abrufst (So zb. "Press Enter to exit") - deswegen hält win das programm für beendet und schliesst das console window. versuch mal mit "cmd" eine konsole zu öffnen und das programm manuell ausführen - so solltest den ganzen output sehen.
hoffe ich hab dein problem richtig interpretiert...
lg
wolfgang -
Hi!
Danke erstmals für die rasche Antwort.
Wenn ich eine weitere Ausgabe hab und dann eine Eingabe nach zum Beispiel "Y" für yes fordere - dann funktioniert das - aber das muss doch auch irgendwie anders gehn - oder? So eine Art break und dann mit Enter aussteigen?
Das hier wäre zum Beispiel der erste Übungsquellcode aus meinem Buch:
-
Zitat von iveo
Wenn ich eine weitere Ausgabe hab und dann eine Eingabe nach zum Beispiel "Y" für yes fordere - dann funktioniert das - aber das muss doch auch irgendwie anders gehn - oder?
dein problem liegt _nicht_ im bereich deines programmes. dein programm wird ausgefuehrt und beendet sich. dann schaltet sich windows ein und fragt nach einer taste um das terminal zu schliessen (siehe wolfmanns posting).irgendwo in den tiefen der windows configurationsdialoge kann man dieses verhalten
sicher mit einem hakerl abschaltenZitat von iveo
Das hier wäre zum Beispiel der erste Übungsquellcode aus meinem Buch:dein buch scheint nicht das neueste zu sein und nebenbei nicht besonders viel
vom c++ standard zu halten.Code
Alles anzeigen// das sind die alten c++ header in denen die classen und funktionen nicht // in die namespaces gemapt werden. man sollte sich von ihnen verabschieden // und statt dessen die neuen verwenden. // #include <iostream> #include <iostream.h> // der standard erlaubt keine funktionsdeclarationen ohne typ // mehr (im gegensatz zum c standard) // int main() main() { int Zahleingabe; int Doppel; int Enter; // wegen den neuen headern brauchen wir auch namespaces // std::cout << .... << std::endl; // ... cout << "Bitte geben Sie eine Zahl ein!" << endl; cin >> Zahleingabe; Doppel = Zahleingabe * 2; cout << "Das Doppelte dieser Zahl ist " << Doppel << endl; // jetzt muessen wir natuerlich auch ein integer zurueckgeben // return 0; }
[/QUOTE]
-
1. Danke für eure Antworten und dafür, dass ihr euch mit solchen Newbie-Fragen auch rumschlägt
2. Was das Buch anbelangt - ich habe mich geirrt - es ist die erste Auflage aus 2003 (was aber auch nicht so alt ist eigentlich?) - hab es jedenfalls mit einem Linuxbuch, das vom gleichen Verlag stammt, verwechselt.
http://www.galileocomputing.de/katalog/bueche…0834A1sX0WczDSs
3. amok - vielleicht kommt das in meinem Buch noch? - main() wird darin jedoch nie typdefiniert - in meinem 2.ten C++ Buch, das ich jedoch als komplizierter einstufe steht eine typische "Hello World!" Ausgabe in der Console zum Beispiel so aus:
wäre das "richtiger"? - sofern es sowas bei Programmiersprachen überhaupt gibt?
4. Ich würde eigentlich gerne mit dem Galilieobuch weiterarbeiten - möchte jedoch auch nichts falsches einstudieren - sollte ich es beiseite legen und mir ein anderes Lehrbuch suchen oder kann ich dabei bleiben?
(Ich meine das ist jetzt bestimmt schwer kalkulierbar für euch, da ihr das Buch wahrscheinlich nicht kennt - doch wenn zu grobe Fehler drin sind, dann leg ichs lieber weg!)
Danke nochmal! :thumb: -
Zitat von iveo
es ist zumindest strict ansi conform obwohl auch hier die alten header verwendet
werdn (was nicht verboten ist aber langsam und sicher aus neuem codeverschwinden
wird). die definition von main vor der declaration main ist in diesem beispiel sinnlos.Zitat von iveo
4. Ich würde eigentlich gerne mit dem Galilieobuch weiterarbeiten - möchte jedoch auch nichts falsches einstudieren - sollte ich es beiseite legen und mir ein anderes Lehrbuch suchen oder kann ich dabei bleiben?
(Ich meine das ist jetzt bestimmt schwer kalkulierbar für euch, da ihr das Buch wahrscheinlich nicht kennt - doch wenn zu grobe Fehler drin sind, dann leg ichs lieber weg!)wenn dir das buch gefaellt und du damit gute fortschritte machst, lerne ruhig damit
weiter. du solltest dir aber bewusst sein dass du spaeter c++ code sehen wirst, der
ganz anders aussieht bzw. deine programme mit unterschiedlichen compilern nicht
ohne probleme compilierbar sein werden.das ist als anfaenger kein problem. wenn du allerdings ernsthaft projekte in c++
realisieren willst solltest du dich mit literatur befassen, die sich standardkonformer
und penibler mit der sprache auseinander setzt.lg
amok -
ich weiß - ist scho ewig her der post - aber ist was verkehrt daran wenn ich vor dem return 0; ein getchar(); einfüg damit er mir die konsole nicht schließt?
-
-
Zitat
irgendwo in den tiefen der windows configurationsdialoge kann man dieses verhalten
sicher mit einem hakerl abschaltenHab ich zumindest noch nirgends gesehen.
Dass das Fenster offen bleibt, passiert nur, wenn man es unter VC++ ausführt - das wird irgendwie über vcspawn.exe gemacht.
IMHO sollte man Konsolenprogramme von der Konsole ausführen, dann hat man dieses Problem nicht.
-
Mit diesem Eintrag in RegEdit:
HKEY_CLASSES_ROOT\Folder\shell\Open To Dos\command\(Standard) = C:\Windows\System32\cmd.exe
Kannst du im Explorer jetzt einfach per Rechsclick->Open To Dos auf nen Ordner ein Dosfenster fuer diesen Ordner aufmachen. Also der Pfad zeigt dann schon zu diesem Ordner und du musst nicht umstaendlich von dem Standard C:\Windows\System32\ dich erst dorthin bewegen.
Damit hast jetzt ein Fenster in dem du dein Programm testen kannst.
-
Nur sollte man es anders nennen, weil der Begriff "Dos" nicht den Tatsachen entspricht. Shell zB, oder einfach nur Command Shell oder Command Prompt.
-
habs mittlerweile so gelöst:
weil das mit dem getchar(); nicht immer funktioniert hat - andererseits bin ich gerade wieder auf die schnautze gefallen damit - weil es anscheinend auch nicht immer funktioniert ... sowas von spanisch das ganze - ich verstehs nicht... deshalb liefer ich noch schnell 2 billigsdorfer beispiel:
hier gehts:
Code
Alles anzeigen#include <iostream.h> int main() { short int zahl; zahl = 32767; cout << "kleine Zahl: " << zahl << "\n"; zahl++; cout << "kleine Zahl: " << zahl << "\n"; zahl++; cout << "kleine Zahl: " << zahl << endl; cout << "Press ENTER to continue..." << endl; cin.get(); return 0; }
und hier gehts nicht:
Code
Alles anzeigen#include <iostream.h> int add(int zahl1, int zahl2) { int erg; erg = zahl1 + zahl2; return erg; } int main() { int ergebnis, z1, z2; cout << "geben Sie die erste Zahl ihrer Additon ein: "; cin >> z1; cout << endl << "Zahl 1 lautet: " << z1 << endl; cout << "geben Sie die zweite Zahl ihrer Addition ein: "; cin >> z2; cout << endl << "Zahl 2 lautet: " << z2; ergebnis = add(z1,z2); cout << endl << endl << "das Ergebnis lautet:" << ergebnis; //warum geht das net? cout << "Press ENTER to continue..." << endl; cin.get(); //warum geht das net? ende... return 0; }
-
Beim zweiten mal funktioniert´s nicht, weil dort vorher schon was eingelesen wurde. Beim Standard Eingabestream werden die Zeichen nicht direkt von der Tastatur eingelesen, sondern von einem Zwischenbuffer, in welchem sich Daten befinden (nämlich das letzte 'Return')
Die einfachste (aber nicht sehr saubere) Lösung ist, nach jeder (bzw. nach der letzen) Eingabe einmal cin.get() aufzurufen, um das letzte 'Return' aus dem Buffer zu entfernen
Eine andere Lösung wäre, cin nicht zu verwenden und selbst einen Eingastream zu erzeugen, welcher nicht bzw. anders als der Standardstream buffert, was hier aber zu weit führen würde.
-
Maximilian Rupp
27. Dezember 2024 um 12:06 Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.
Jetzt mitmachen!
Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!