Falscher Compiler oder falsches Lehrbuch?



  • Hey,

    ich schätze mal die meisten (oder vll sogar alle) von euch kennen das Buch "Die Programmiersprach C++" von Bjarne Stroustrup....
    Mit wurde dieses Buch von jemanden in einem anderen Forum als Buch zum lernen von C++ empfohlen... nun ich habe es nun, und ich (probiere) damit zu lernen, allerdings scheitere ich schon beim 6. Abschnitt (dem Taschenrechner) ich habe den Code abgeschrieben (bist 6.1.7 [von daan ist der Code vollständig]) und wollte ihn Compillieren allerdings gibt mein Compiler sehr viele Fehler aus und ich weis nciht warum... und es sind keine syntaxfehler alias ';' vergessen oder 'deafult' sondern Fehler die ich nicht verstehe (gut, logisch sonst würde ich hier nicht um hilfe bitten :P)...

    Mein Compiler ist DevC++

    Meine Frage ist nun.... habe ich den Falschen Compiler oder bin ich zu bräsig um den QC richtig abzuschreiben...

    Mfg Judas

    PS: Da ich nicht weis ob der QC wichtig ist poste ich ihn einfach mal.... wenn ihr ihn nicht braucht... einfach lesen... und ich lösche ihn wieder wenn ich wieder reinschaue...

    Ich danke schonmal im V o r r a u s(ka aber das Forum mag dieses Wort nicht es macht lauter '*') für Antworten...

    #include <iostream>  //Ein-/Ausgabe
    #include <string>    //Strings
    #include <map>       //Map
    #include <cctype>    //isalpha() usw.
    
    using namespace std;
    
    program:
       END
       expr_list END
    
    expr_list:
       expression PRINT
       expression PRINT expr_list
    
    expression:
       expression + term
       expression - term
       term
    
    term
       term / primary
       term * primary
       primary
    
    primary:
       NUMBER
       NAME
       NAME = expression
       - primary
       (expression)
    
    enum Token_value
    {
         NAME, NUMBER, END,
         PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
         PRINT = ';', ASSIGN = '=', LP = '(', RP = ')'
    };
    
    Token_value curr_tok = PRINT;
    
    double expr(bool get)
    {
           double left = term(get);
    
           for(;;)
               switch(curr_tok)
               {
                               case PLUS:
                                    left += term(true);
                                    break;
                               case MINUS:
                                    left -= term(true);
                                    break;
                               default:
                                    return left;
               }
    }
    
    double term(bool get)
    {
           double left = prim(get);
    
           for(;;)
               switch(curr_tok)
               {
                               case MUL:
                                    left *= prim(true);
                                    break;
                               case DIV:
                                    if(double d = prim(true))
                                    {
                                              left /= d;
                                              break;
                                    }
                                    return error("Division du Null, du bist ein Noob");
                               default:
                                       return left;
               }
    }
    
    double number_value;
    string string_value;
    
    double prim(bool get)
    {
           if(get) get_token();
    
           switch (curr_tok)
           {
                  case NUMBER:
                       {
                              double v = number_value;
                              get_token();
                              return v;
                       }
                  case NAME:
                       {
                            double& v = table[string_value];
                            if (get_token() == ASSIGN) v = expr(true);
                            return v;
                       }
                  case MINUS:
                       return -prim(true);
                  case LP:
                       {
                              double e = expr(true);
                              if (curr_tok != RP) return error(") erwarted");
                              get_token();
                              return e;
                       }
                       default:
                               return error("primary erwarted");
           }
    }
    
    int no_of_errors;
    
    Token_value get_token()
    {
                char ch;
    
                do
                {
                     if(!cin.get(ch)) return curr_tok = END;
                }while(ch != '\n' && isspace(ch));
                switch(ch)
                {
                          case ';':
                          case '\':
                               return curr_token = PRINT;
                          default:
                                  if(isalpha(ch))
                                  {
                                                 string_alue = ch;
                                                 while (cin.get(ch) && isalnum(ch)) string_value.push_back(ch);
                                                 cin.putback(ch);
                                                 retunr curr_tok = NAME;
                                  }
                                  error("Falsches Token");
                                  retunr curr_tok = PRINT;
                }
    }
    
    double error(const string& s)
    {
           no_of_errors++;
           cerr << "Fehler: " << s << '\n';
           return 1;
    }
    
    int main()
    {
        table["pi"] = 3.1415926535897932358; //vordefinierte Namen einfügen
        table["e"]  = 2.7182818284590452354;
    
        while(cin)
        {
                  get_token();
                  if(curr_tok == END) break;
                  if(curr_tok == PRINT) continue;
                  cout << expr(false) << '\n';
        }
    
        return no_of_errors;
    }
    


  • Zeile 136: mach aus dem case '\' ein case '\'
    ansonsten habe ich i-wie ne abneigung gegen den code 😃



  • in dem code *sind* aber viele solche fehler (z.b. retunr statt return).
    außerdem gehört das:

    program:
       END
       expr_list END
    
    expr_list:
       expression PRINT
       expression PRINT expr_list
    
    expression:
       expression + term
       expression - term
       term
    
    term
       term / primary
       term * primary
       primary
    
    primary:
       NUMBER
       NAME
       NAME = expression
       - primary
       (expression)
    

    *nicht* in den code. (das ist kein c++-code)

    ansonsten fehlen für alle funktionen vorwärts-deklarationen.
    ich denke mal nicht, dass das tatsächlich eins-zu-eins so im stroustrup steht. (ich hab meine ausgabe allerdings gerade verliehen) - du hast die funktionen wahrscheinlich in der falschen reihenfolge zusammengesetzt.



  • Wieso baut man in dem Buch einen Taschenrechner?



  • soweit ich mich erinnern kann ist das nur ein einstiegscode um zu demonstrieren, wie std::map und std::string das leben verbessern - in einem kapitel noch bevor erklärt wird, wie man klassen selbst definiert. (ist auch nicht unbedingt für anfänger geeignet IMO)



  • Aja...

    ich weis das da relativ viele Fehler alias 'retrn' drinne sind, aber die finde ich auch....^^ die anderen Fehler verstehe ich nicht..... 😕

    Keyy....

    @queer-boy: Was sind vorwärtsdeklarationen?/Soll das heissen der muss nicht funktionieren sondern ich soll einfach das Kapitel lesen und die 'natur' akzeptieren :P??
    @Fake oder echt: Was hast du gegen den Code?
    @Kein Kenner des Buches: Das soll an beispielen demonstrieren wie sachen funktionieren



  • @queer-boy: Was sind vorwärtsdeklarationen?/Soll das heissen der muss nicht funktionieren sondern ich soll einfach das Kapitel lesen und die 'natur' akzeptieren :P??

    nö, nur hab ich den code vorhin zwar durch das ausbessern dieser tippfehler zum kompilieren gebracht, aber nachdem ich ausprobiert hab, ob er auch macht, was er soll, ... tja

    ad deklaration:

    void foo ()
    {
       bar (42);
    }
    
    void bar (int i)
    {
    }
    

    die funktion foo ruft bar auf, mit einem integer-argument (42). nur: dein compiler kennt die funktion bar zu diesem zeitpunkt nicht, kann also gar nicht wissen, ob sie ein argument übernimmt. um das sicherzustellen, musst du die funktion vorher deklarieren:

    void bar (int);
    
    void foo ()
    {
       bar (42);
    }
    
    void bar (int i)
    {
    }
    

    - oder die ganze funktionsdefinition *vor* die definition von foo stellen.

    den ausdruck "vorwärtsdeklaration" bezieht man allerdings (mein fehler) hauptsächlich auf klassendeklarationen. (vorwärtsdeklaration synonym zu klassendeklaration - bei funktionsdeklarationen sagt man idR nur "deklaration".

    PS: "voraus" schreibt man mit einem R, das forum will also nur, dass du recht-schreibst 😉



  • Judas schrieb:

    @Fake oder echt: Was hast du gegen den Code?

    program:
       END
       expr_list END
    
    expr_list:
       expression PRINT
       expression PRINT expr_list
    
    expression:
       expression + term
       expression - term
       term
    
    term
       term / primary
       term * primary
       primary
    
    primary:
       NUMBER
       NAME
       NAME = expression
       - primary
       (expression)
    

    Mehr brauch ich dazu wohl nicht sagen 😃

    Hast du mal alles verbessert? Also das case '\' zu case '\' gemacht, die ganzen retrnus oder sowas verbessert? Ansonsten wären die Fehlermeldungen ganz praktisch...



  • bin gerade bei einm Freund und da der keine Ahnung hat was ein Compiler ist darf ich den auchnicht installieren das heist ich muss bis heute abend warten bis ich eure Vorschläge ausprobieren kann :P.... wird aber noch.....

    Hmm...

    mit vorwärtsdeklaration meinst du:

    #include <iostream>
         //dann heir die restlichen Bibliotheken...
    
         using namespace std;
    
          //und hier dann die 'Köpfe' der Funktionen?
          //z.b.
          double expr(bool get);
         //etc....
    


  • Mein Compiler ist DevC++

    du hast selbst keine ahnung was ein compiler ist :p



  • program:
    END
    expr_list END

    expr_list:
    expression PRINT
    expression PRINT expr_list

    expression:
    expression + term
    expression - term
    term

    term
    term / primary
    term * primary
    primary

    primary:
    NUMBER
    NAME
    NAME = expression
    - primary
    (expression)

    Das soll die Grammatik des Programms darstellen. Und bezeichnet ja, wie man den Rechner nachher benutzen kann.

    Ich danke schonmal im V o r r a u s(ka aber das Forum mag dieses Wort nicht es macht lauter '*') für Antworten...

    Man schreibt ja voraus, nur ein r. 😉



  • Judas schrieb:

    ...V o r r a u s(ka aber das Forum mag dieses Wort nicht es macht lauter '*') ...

    Der Duden hilft da weiter. 😉
    (sowieso ein Buch, das gerade in Internetzeiten in gleichem Maße an Relevanz wie an Ignoranz zunimmt)

    Gruß,

    Simon2.



  • Simon2 schrieb:

    ..(sowieso ein Buch, das gerade in Internetzeiten in gleichem Maße an Relevanz wie an Ignoranz zunimmt)

    😃



  • Und um die Frage im Titel zu beantworten...
    beides!
    Aber mit dem Problem hat das nix zu tun^^



  • Ich bin einfallslos schrieb:

    Und um die Frage im Titel zu beantworten...
    beides!
    Aber mit dem Problem hat das nix zu tun^^

    Naja, das Buch finde ich recht gut. Man muss sich mal an die kompakte Informationsflut gewöhnen, aber dann geht es recht gut.



  • aja, was soll das heissen das ihc ka von Compilern habe?? Sage mir was ich falsch gemacht habe/denke und ich werde mich verbessern 😛

    Was hast du gegen DevC++ das ist der Compilername....



  • LOL Dev-C++ ist eine IDE und kein Compiler



  • DevC++ ist Müll. Hol dir lieber Visual Studio 2008 Express, da bekommst du dann auch den besten Compiler.



  • Profimann schrieb:

    DevC++ ist Müll. Hol dir lieber Visual Studio 2008 Express, da bekommst du dann auch den besten Compiler.

    Den "besten" Compiler würde ich definitiv nicht sagen, aber inzwischen gehört der VC-Compiler tatsächlich zu den besseren (und auf Windows würde ich diesen auch verwenden).

    cu André



  • dieses Visual sagt das nciht so viel wie 'visual' ??? Kann ich das überhaupt für das 'normale' Cpp verwenden??
    Und wenn ja... was ist daran besser und ist es kostenlos... (wenn beides Ja dann bitte auch n Link, bei meiner Letzten suche bin ich nur auf DevC++ gestossen...)

    Was zur Hölle ist n IDE??




Anmelden zum Antworten