Problem mit Konsolenanwendung



  • Hi Leute,

    ich hab ein komisches Problem bzw. ich versteh es einfach nicht.
    Hab ein Konsolenprogramm geschrieben doch wenn ich es testen will bleibt die Konsole beim ersten starten schwarz.
    Beim zweiten Versuch läuft das Programm dann wunderbar durch.
    Ändere ich jetzt aber etwas, zum Beispiel lösche ich einen Teil des Codes und compeliere das Programm erneut hat sich an dem Programm nichts geändert.
    Sprich selbst gelöschter Code wird ausgeführt.

    Das Problem besteht unter Code::Blocks sowie unter Visual Studio, wobei VS nach einer Änderung wieder die schwarze Konsole zeigt.

    Bin über jede Idee dankbar.

    Niie



  • Meine Kristallkugel ist gerade in der Reinigung, zeig mal Code.



  • Kann mir nict vorstelln das es am code liegt aber bitte:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        // Variablen
        int zahl = 0, position = 0;
        // Arrays
        int reste [16] = {0};
    
        while (zahl == 0)
        {
            cout << "Geben Sie den Wert ein, der umgerechnet werden soll: ";
            cin >> zahl;
    
            if (cin.fail() == true)
            {
                cout << "Fehler konnte Zahl nicht lesen! Bitte versuchen Sie es erneut!";
                cin.clear();
                cin.ignore(BUFSIZ, '\n');
            }
            if (zahl > 65535)
            {
                cout << "Es tut mir leid, aber ich kann nur Zahlen bis maximal 65.535 umwandeln.";
                zahl = 0;
            }
        }
    
        return 0;
    }
    

    Wie gesagt beim ersten mal schwarze Konsole
    Zweites mal geht alles
    ändere ich dann aber etwas zum Beispiel lösche etwas innerhalb einen Strings übernimmt er die Änderung nicht.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (auch C++0x und C++11) in das Forum Compiler- und IDE-Forum verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Nachtrag:
    Die Konsole blöeibt nicht schwarz sonder das Programm läuft nach extrem langer Zeit erst an.



  • Dein Programm kompiliert gar nicht, da BUFSIZ (sollte wohl eher BUFSIZE) heissten nicht definiert ist.
    So sollte es klappen:

    #include <iostream> 
    
    using namespace std; 
    
    int main() 
    { 
      const int BUFSIZE = 256; // Oder sonst irgend eine Konstante
      int zahl = 0, position = 0; 
      int reste [16] = {0}; 
    
      while (zahl == 0) 
      { 
          cout << "Geben Sie den Wert ein, der umgerechnet werden soll: "; 
          cin >> zahl; 
    
          if (cin.fail() == true) 
          { 
            cout << "Fehler konnte Zahl nicht lesen! Bitte versuchen Sie es erneut!"; 
            cin.clear(); 
            cin.ignore(BUFSIZE, '\n'); 
          } 
          if (zahl > 65535) 
          { 
            cout << "Es tut mir leid, aber ich kann nur Zahlen bis maximal 65.535 umwandeln."; 
            zahl = 0; 
          } 
      } 
    
      return 0; 
    }
    

    Du musst darauf achten was dein Compiler ausgibt. Bei deinem obigen Programm wurde sicher eine Fehlermeldung ausgegeben. Je nach Einstellung wird dann einfach das alte Programm ausgefuehrt.



  • Wie geasgt das Programm funktioniert acu so mit BUFSIZ problem ist nur das es eben 30 Sekunden dauert bis es startet.
    Auch wenn ich die

    if (cin.fail() == true)
    {
        cout << "Fehler konnte Zahl nicht lesen! Bitte versuchen Sie es erneut!";
        cin.clear();
        cin.ignore(BUFSIZE, '\n');
     }
    

    auskommentiere benötigt er solange...



  • Hab jetzt rausgefunden das es an der while Schleife liegt... sprich wenn ich die rausnehme gehts es... warum auch immer...



  • Hmm, das ist merkwuerdig. Die while-Schleife sieht in Ordnung aus.

    Eventuell braucht es ein

    cout.flush();
    

    nach dem

    cout << "Geben Sie den Wert ein, der umgerechnet werden soll: ";
    

    Bin mir aber jetzt auch nicht sicher.. kannst es ja mal ausprobieren.



  • Ja hab Deinen ausprobiert. Genau das gleiche Problem.
    Wenn ich die while Schleife zu test zwecken in eine

    if (1){...}
    

    ändere geht es.

    Wie gesaht das Programm läuft auch braucht aber eben ca. 30 Sekunden bis es läuft 😃

    Mittleerweile ist es etwas größer geworden ...

    #include <iostream>
    
    using namespace std;
    
    void rechne(int, int, int[]);
    void zeige (int, int, int[]);
    
    // rechne führt die Rechenoperationen durch um die Zahl umzuwandeln
    void rechne(int zahl, int basiszahl, int reste[])
    {
        for (int i = 0; i < 16; i++)
        {
            reste[i] = zahl % basiszahl;
            zahl = zahl / basiszahl;
        }
    }
    
    // zeige stellt das Ergebniss dar
    void zeige(int zahl, int basiszahl, int reste[])
    {
        cout << "Die Umrechnung der Zahl " << zahl << " in das Zahlensystem mit der Basiszahl " << basiszahl << '\n';
    
        for (int i = 0; i < 16; i++)
        {
            cout << reste[15-i];
    
            if ((i+1) % 4 == 0)
            {
                cout << " ";
            }
        }
    }
    
    int main()
    {
        // Variablen
        int zahl = 0, basiszahl = 0;
        // Arrays
        int reste [16] = {0};
    
    // Abfrage der Zahl die Umgewandelt werden soll
    
        while (zahl == 0)
        {
            cout << "Geben Sie den Wert ein, der umgerechnet werden soll (max. 65.535): ";
            cin >> zahl;
    
    // Exeption wenn cin die Zahl nicht lesen kann
            if (cin.fail() == true)
            {
                cout << "Fehler konnte Zahl nicht lesen! Bitte versuchen Sie es erneut!";
                cin.clear();
                cin.ignore(BUFSIZ, '\n');
            }
    
    // Exeption wenn die Zahl größer ist als 65.535
            if (zahl > 65535)
            {
                cout << "Es tut mir leid, aber ich kann nur Zahlen bis maximal (65.535) umwandeln." << '\n';
                zahl = 0;
            }
        }
    
        while (basiszahl == 0)
        {
            cout << "Geben Sie die Basiszahl des Zahlensystems an in welches die Umrechnung erfolgen soll (2-9):";
            cin >> basiszahl;
    
    // Exeption wenn cin die Zahl nicht lesen kann
            if (cin.fail() == true)
            {
                cout << "Fehler konnte Zahl nicht lesen! Bitte versuchen Sie es erneut!";
                cin.clear();
                cin.ignore(BUFSIZ, '\n');
            }
    // Exeption wenn die Basiszahl kleiner als 2 oder größer als 9 ist
            if (basiszahl > 9 || basiszahl < 2)
            {
                cout << "Es tut mir leid, aber ich kann nur in Zahlensystem mit der Basiszahl 2-9 wandeln";
                basiszahl = 0;
            }
        }
    
        rechne(zahl, basiszahl, reste);
        zeige(zahl, basiszahl,reste);
    
        return 0;
    }
    

    Läuft es bei Dir richtig?



  • Niie schrieb:

    Läuft es bei Dir richtig?

    Ja.

    Aber: Wie kommst du auf

    cin.ignore(BUFSIZ, '\n');
    

    ?

    Was passiert mit Eingaben wie 66000fooo bzw. 12bar ?



  • Bei Eingaben wie 12bar erscheint zwar eine Fehlermeldung die so nicht sein sollte aber das Programm läuft zumindest durch und rechnet auch korrekt um.

    Ich will mit

    cin.ignore(BUFSIZ, '\n');
    

    alle Zeichen aus dem Puffer löschen dabei ist BUFSIZ ein vordefinierter wert in höhe des Puffers.



  • Niie schrieb:

    [...] dabei ist BUFSIZ ein vordefinierter wert in höhe des Puffers.

    Schau' mal.



  • mein compiler sagt auch das BUFSIZ nicht deklariert ist.

    Ich glaube du müsstest erstmal sowas machen

    #define BUFSIZ 256
    

    oder in deine zeilen 53 und 74 direkt

    cin.ignore(256, '\n');
    

    schreiben.

    Bei mir hat er jetzt keine lange ladezeit.



  • Photon schrieb:

    mein compiler sagt auch das BUFSIZ nicht deklariert ist.

    Ich glaube du müsstest erstmal sowas machen [...]

    BUFSIZ.



  • ok ist es dann weil kein setbuf verwendet wurde? weil mein compiler will das so wie es ist nicht ausführen. Aber ich hab auch nicht so viel ahnung.



  • Photon schrieb:

    ok ist es dann weil kein setbuf verwendet wurde?

    Ich glaub' nicht, daß C-I/O-Streams ( FILE * ) in dieser Hinsicht viel mit C++-IO-Streams ( std::istream , std::ostream ) zu tun haben.

    Photon schrieb:

    [...] weil mein compiler will das so wie es ist nicht ausführen.

    "So wie es ist" kann ich in meiner Glaskugel nicht erkennen.

    Swordfish schrieb:

    Schau' mal.

    Du willst

    #include <limits>
    #include <iostreams>
    
    // ...
    
    std::cin.clear();
    std::cin.ignore( std::numeric_limits< std::streamsize >::max(), '\n');
    
    // ...
    


  • Swordfish schrieb:

    Schau' mal

    Kannst'd' 'mal mit dei'nen Deppenapostrophen aufhör'n? Das' is' wirklich' un'erträglich!
    Lass die einfach weg.
          ↑ Es heisst z.B. lass und nicht lass', wie auch is (für ugs. ist) und nicht is'.



  • fischkopf schrieb:

    Swordfish schrieb:

    Schau' mal

    Kannst'd' 'mal mit dei'nen Deppenapostrophen aufhör'n? Das' is' wirklich' un'erträglich!
    Lass die einfach weg.
          ↑ Es heisst z.B. lass und nicht lass', wie auch is (für ugs. ist) und nicht is'.

    Im Falle von "Schau mal!" hast du tatsächlich Recht.

    fischkopf schrieb:

    Kannst'd'

    Bei der Auslassung von ganzen Wörtern (du) braucht's kein Apostroph.

    fischkopf schrieb:

    'mal

    Auslassung von "ein" am Wortbeginn. Ok.

    fischkopf schrieb:

    [...] dei'nen

    Keine Auslassung ➡ Deppenapostroph

    fischkopf schrieb:

    aufhör'n

    Auslassung des e.

    fischkopf schrieb:

    Das'

    Keine Auslassung ➡ Deppenapostroph

    fischkopf schrieb:

    is'

    Auslassung des t.

    fischkopf schrieb:

    wirklich'

    Keine Auslassung ➡ Deppenapostroph

    fischkopf schrieb:

    un'erträglich

    Keine Auslassung ➡ Deppenapostroph

    fischkopf schrieb:

    Es heisst z.B. lass und nicht lass' [...]

    Wo hab' ich jemals "lass'" geschrieben??



  • Swordfish schrieb:

    fischkopf schrieb:

    Es heisst z.B. lass und nicht lass' [...]

    Wo hab' ich jemals "lass'" geschrieben??

    "lass'" ist genauso dämlich wie die Forme, die du wirklich verwendet hast.

    Kleine Liste der von dir in letzter Zeit gebrauchten Apostrophen:
    'mal
    hab'
    glaub'
    schau'
    dacht'
    such'
    könn't
    zeig'
    schau'
    seh'
    hätt'
    gern'
    'ne
    für's
    'raussuchen
    soll's
    hab'
    mach'ma
    d'raus
    wär's
    d'rumherum
    hab'
    wie's
    graut's
    geh'
    würd'
    wär's
    'raus
    gäb's

    Jedes einzelne ist entweder falsch oder unüblich. Bei mach'ma hiesse richtig mach ma', ansonsten wäre nie ein Apostroph angebracht.

    Grundsätzlich gilt: http://www.canoo.net/services/GermanSpelling/Regeln/Interpunktion/Apostroph.html

    Man schreibt im Allgemeinen keinen Apostroph für das weggefallen Schluss-e in häufig gebrauchten Varianten von auf e endenden Wörtern

    Bei verkürzten Formen von mit herauf, heraus, herein, herüber, herunter usw. gebildeten Wörtern schreibt man im Allgemeinen keinen Apostroph

    Die amtlichen Regeln sind weniger explizit, sie listen nur Fälle auf, bei denen Apostrophe gebraucht werden.

    (2) Wörter mit Auslassungen, die ohne Kennzeichnung schwer lesbar
    oder missverständlich sind

    Keine deiner Nutzungen erhält ohne Apostroph eine schwer verständliche Bedeutung.

    Man kann den Apostroph setzen, wenn Wörter gesprochener Sprache
    mit Auslassungen bei schriftlicher Wiedergabe undurchsichtig sind.

    graut's => Heute als geflügeltes Wort auch ohne Apostroph verständlich: http://de.wikipedia.org/wiki/Liste_gefl%C3%BCgelter_Worte/H#Heinrich.21_Mir_grauts_vor_dir.
    d'rumherum => drumherum steht sogar so im Duden
    mach'ma => ja, machma ist komisch. Aber der Apostroph steht am falschen Ort.

    Der Apostroph steht nicht dann, wenn man irgendwo etwas weggelassen haben könnte, sondern wenn es ihn wirklich braucht.


Anmelden zum Antworten