Fehlermeldung



  • OK, guter vergleich^^



  • Honky schrieb:

    OK, guter vergleich^^

    ich hoff ja immernoch, dass iwann mal nen neuer toller vergleich kommt - langsam wirds langsam mit der pferd/auto-geschichte 😛



  • Naja, das Problem mit der Terminierung hab ich jetz begriffen, nur hab ich jetzt noch ein Problem. Meine for-Schleife wird einfach übergangen??? Warum?

    Liegt das etwa an meiner IDE? (benutze codeBlocks)



  • Hy

    Wie übergangen? was meinst du damit?

    Nur so nebenbei solange du es einfach ausführst kann es nicht an der IDE liegen weil diese dir
    unter die Arme greift in Sachen Projekt Zusammenstellung und Aufruf des Compilers. Und bei guten
    noch etwas Syntax-Highligting und IntelSense aber mehr auch nicht.

    Im Debugging Modus könnte es sein, das dir die IDE das falsche anzeigt, aber ich kann mich nicht
    erinnern das ich das jemals Probleme mit CodeBlocks hatte und ich benutzt es schon seit langem.

    Mfg marco


  • Mod

    Honky schrieb:

    Naja, das Problem mit der Terminierung hab ich jetz begriffen, nur hab ich jetzt noch ein Problem. Meine for-Schleife wird einfach übergangen??? Warum?

    Aktuellen Code zeigen!

    Liegt das etwa an meiner IDE? (benutze codeBlocks)

    Nein.



  • Ich habe die C-Strings nicht weggelassen, da es ja auch mit ihnen realisierbar sein müsste.

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
    
        char* carray[30];
        int eingabe;
        bool end_loop = true;
    
        do
        {
            cout << "Druecken sie '1' fuer ein neues Spiel!" << endl;
            cout << "Druecken sie '2' um das Programm zu beenden!" << endl;
            cin >> eingabe;
    
            if(eingabe == 1)
            {
                cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): ";
                cin.getline(carray, sizeof(carray));
    
                for(signed int i = 0; i < strlen(carray); i++)
                {
                    cout << "-";
                }
            }
    
            else
            {
                end_loop = false;
            }
    
        }
            while(end_loop == true);
            cout << "Programm wird beendet..." << endl;
            return 0;
    }
    

    Ich glaube ich habe mich falsch ausgedrückt, die for-schleife wird nicht übergangen, ich habe es jedoch geschafft irgendwo eine endlosschleife einzubauen. Wenn ich das nun Compiliere und 1 drücke wird erstmal ausgegeben:
    "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): " Direkt dahinter werden dann wieder die anweisungen drücke 1 oder 2 gestellt. (Warum)
    Gebe ich dann ein Wort/Buchstabe ein lauft das Programm unendlich durch.



  • while(end_loop == true);
    

    Als erstes:

    Du brauchst der Anweisung nicht zu sagen, das sie "Wahr" sein soll, du kannst also einfach

    while(end_loop);
    

    schreiben.

    So wie die Schleife jetzt aufgebaut ist, würdest du das Programm beenden, wenn du bei der ersten Eingabe keine 1 gemacht hast. Ist das Sinn und Zweck?
    Ich würde das

    end_loop = false
    

    in die "true" Bedingung setzen, würde zumindest meiner Meinung nach mehr Sinn ergeben 🙂

    würde dann in etwa so aussehen:

    #include <iostream>
    #include <cstring>
    
    using namespace std;
    
    int main()
    {
    
        char* carray[30];
        int eingabe;
        bool end_loop = true;
    
        do
        {
            cout << "Druecken sie '1' fuer ein neues Spiel!" << endl;
            cout << "Druecken sie '2' um das Programm zu beenden!" << endl;
            cin >> eingabe;
    
            if(eingabe == 1)
            {
                cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): ";
                cin.getline(carray, sizeof(carray));
    
                for(signed int i = 0; i < strlen(carray); i++)
                {
                    cout << "-";
                }
                end_loop = false;
            }
        } while(end_loop);
            cout << "Programm wird beendet..." << endl;
            return 0;
    }
    


  • Und mit std::string wäre der Code dann sogar schön und sicher.



  • Nur mein Problem bleibt.
    Ich komme nicht zur eingabe des Wortes.


  • Mod

    Honky schrieb:

    Nur mein Problem bleibt.
    Ich komme nicht zur eingabe des Wortes.

    Und ich kann's nnoch nicht einmal compilieren. Denn es ist einfach totaler Mist und das müsste dir dein Compiler auch sagen:

    char* carray[30];
    

    Das ist ein Array von char*. Das ist kein C-String! Entsprechend gehen auch alle späteren Stringoperationen schief:

    test.cc: In function ‘int main()’:
    test.cc:22: [b]error: no matching function for call to ‘std::basic_istream<char, std::char_traits<char> >::getline(char* [30], long unsigned int)’[/b]
    /usr/include/c++/4.4/istream:593: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize, _CharT) [with _CharT = char, _Traits = std::char_traits<char>]
    /usr/include/c++/4.4/istream:405: note:                 std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(_CharT*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>]
    test.cc:24: [b]error: cannot convert ‘char**’ to ‘const char*’ for argument ‘1’ to ‘size_t strlen(const char*)’
    [/b]
    

    Das alles würdest du dir sparen, wenn du endlich std::string benutzen würdest. Das ist irgendwie als wenn du zum Arzt gehst und jammerst, dass dein Kopf weh tut, wenn du vor die Wand läufst. Da kann man eben nur antworten, dass du aufhören sollst absichtlich vor die Wand zu laufen.

    edit: So ungefähr wolltest du es wohl haben. Man könnte das ganze natürlich noch besser machen, indem man auf Fehleingaben reagiert, aber wir wollen für den Anfang mal nicht übertreiben:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
    
      int eingabe;  
    
      do
        {
          cout << "Druecken sie '1' fuer ein neues Spiel!" << endl;
          cout << "Druecken sie '2' um das Programm zu beenden!" << endl;
          cin >> eingabe;
    
          if(eingabe == 1)
            {
              cout << "Geben sie ein Wort ein! (Bitte nur Grossbuchstaben): ";
              string str;
              cin >> str;   // So leicht kann das sein. 
    
              for(unsigned int i = 0; i < str.size(); i++) // Warum signed, wenn i doch ganz klar nur positiv sein kann?
                {
                  cout << "-";
                }
              cout<<endl;   // Neue Zeile nach den ----, das sieht hübscher aus.
            }
        } while(eingabe!=2);   // Wozu das Gefrickel mit end_loop?
      cout << "Programm wird beendet..." << endl;
      return 0;
    }
    


  • Das mit dem char-Zeiger war ein versehen, hab ich in meinem eigenen code auch nicht rein machen wollen.

    Und das mit dem end_loop wurde mir von anderen vorgeschlagen. Zuvor hatte ich auch die abfrage mit

    while(eingabe !=2);
    

    Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.

    Trotzdem danke

    PS: Was benutzt du denn für ne IDE



  • Honky schrieb:

    Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.

    Klar geht es, aber es ist einiges umständlicher, als mit std::string .


  • Mod

    Honky schrieb:

    Und zu den C-Strings: Wenn es wirklich so schlimm ist, dass ich C-Strings benutze, dann lass ich es eben bleiben. Ich dachte nur es müsste auch mit diesen gehen.

    Geht auch, ist aber schwieriger. Warum sich das Leben absichtlich schwer machen?

    PS: Was benutzt du denn für ne IDE

    Emacs, warum?



  • Nur so, bin interessiert was sonst noch so gängig ist!


Anmelden zum Antworten