1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

Consolenprogramm bricht in WinXP ab

  • iveo
  • 24. September 2004 um 18:44
  • Unerledigt
  • iveo
    8
    iveo
    Mitglied
    Reaktionen
    1
    Punkte
    641
    Beiträge
    115
    • 24. September 2004 um 18:44
    • #1

    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. :frowning_face:

    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!

  • wolfmann
    11
    wolfmann
    Mitglied
    Reaktionen
    2
    Punkte
    1.252
    Beiträge
    238
    • 24. September 2004 um 18:59
    • #2

    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

    -------------------
    “If you hear hoof beats, you should look for horses, not zebras.”
    --
    "You, Sir, are an Idiot!" - George Hamilton

  • iveo
    8
    iveo
    Mitglied
    Reaktionen
    1
    Punkte
    641
    Beiträge
    115
    • 24. September 2004 um 21:22
    • #3

    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:

    Code
    #include <iostream.h>
     
     main()
     {
     	int Zahleingabe;
     	int Doppel;
     	int Enter;
    
     	cout << "Bitte geben Sie eine Zahl ein!" << endl;
     	cin >> Zahleingabe;
     	Doppel = Zahleingabe * 2;
     	cout << "Das Doppelte dieser Zahl ist " << Doppel << endl;
     }
    Alles anzeigen
  • amok
    5
    amok
    Mitglied
    Punkte
    190
    Beiträge
    38
    • 24. September 2004 um 22:03
    • #4
    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 abschalten :)

    Zitat 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
    // 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;
    }
    Alles anzeigen

    [/QUOTE]

  • iveo
    8
    iveo
    Mitglied
    Reaktionen
    1
    Punkte
    641
    Beiträge
    115
    • 25. September 2004 um 08:50
    • #5

    1. Danke für eure Antworten und dafür, dass ihr euch mit solchen Newbie-Fragen auch rumschlägt :winking_face:

    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:

    Code
    #include <iostream.h>
     
     int main();
     int main()
     {
     cout << "Hello World!\n";
     return 0;
     }




    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:

  • amok
    5
    amok
    Mitglied
    Punkte
    190
    Beiträge
    38
    • 25. September 2004 um 12:43
    • #6
    Zitat von iveo
    Code
    #include <iostream.h>
     
     int main();
     int main()
     {
     cout << "Hello World!\n";
     return 0;
     }




    wäre das "richtiger"? - sofern es sowas bei Programmiersprachen überhaupt gibt?



    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

  • iveo
    8
    iveo
    Mitglied
    Reaktionen
    1
    Punkte
    641
    Beiträge
    115
    • 20. Dezember 2004 um 23:54
    • #7

    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?

  • hal
    32
    hal
    Mitglied
    Reaktionen
    52
    Punkte
    11.122
    Beiträge
    2.208
    • 21. Dezember 2004 um 00:04
    • #8
    Zitat von iveo

    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?

    Gar nix, nur an solche einfachen Lösungen denken Informatiker normalerweise nicht :winking_face:

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 21. Dezember 2004 um 00:34
    • #9
    Zitat

    irgendwo in den tiefen der windows configurationsdialoge kann man dieses verhalten
    sicher mit einem hakerl abschalten

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

  • Kongo
    6
    Kongo
    Mitglied
    Punkte
    295
    Beiträge
    44
    • 21. Dezember 2004 um 05:22
    • #10

    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.

    :thumb: Geschrieben nach der alten, neuen und zukünftigen Rechtschreibung! :thumb:

  • Primenumber
    11
    Primenumber
    Mitglied
    Reaktionen
    2
    Punkte
    1.122
    Beiträge
    218
    • 21. Dezember 2004 um 08:48
    • #11

    Nur sollte man es anders nennen, weil der Begriff "Dos" nicht den Tatsachen entspricht. Shell zB, oder einfach nur Command Shell oder Command Prompt.

  • iveo
    8
    iveo
    Mitglied
    Reaktionen
    1
    Punkte
    641
    Beiträge
    115
    • 30. Dezember 2004 um 23:18
    • #12

    habs mittlerweile so gelöst:

    Code
    cout << "Press ENTER to continue..." << endl; 
     	  cin.get();



    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
    #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;	
     }
    Alles anzeigen




    und hier gehts nicht:

    Code
    #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;    
         }
    Alles anzeigen
  • sixpack
    2
    sixpack
    Mitglied
    Punkte
    25
    Beiträge
    4
    • 28. Januar 2005 um 14:29
    • #13

    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!

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung