gängige Anfänger-Fehler?



  • Daniel E. schrieb:

    c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.

    Habs schon verbessert. Wobei: das kann man ja eigentlich auch aufführen. Gibt zwar ebenfals keinen Fehler, kommt aber zu unvorhersehbaren Fehlern.



  • SirLant schrieb:

    Doch mit 0

    Nur wenn die Schleife global wäre. Dann wiederum erzeugt sie einen Syntaxfehler.

    c++eus: Genau das meinte ich. Viele Compiler warnen allerdings irgendwie.



  • SirLant schrieb:

    Daniel E. schrieb:

    c++eus schrieb:

    Hi,

    mir fällt da gerade etwas ein, was zwar keinen fehler generiert, aber Anfängern mal passieren kann:

    for(int i;i < 10; i++);
     { //...
     }
    

    Aber hallo, i ist nicht initialisiert.

    Doch mit 0

    Mit 0? Wird es nicht mit dem schon im Speicher befindlichen Wert belegt?
    Bei mir kommt folgendes raus:

    1073823776
    


  • Daniel E. schrieb:

    c++eus: Genau das meinte ich.

    War aber eigentlich nicht als Fehler gedacht... 😞



  • Also nur bei globalen Variablen?
    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);



  • SirLant schrieb:

    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);

    Stell mal die Warnungsstufe hoch, dann muß er schon warnen.



  • SirLant schrieb:

    Also nur bei globalen Variablen?
    Mein VC++ warnte nicht als ich folgendes testete in main:
    for (int i; i < 10; i++);

    Lass dir doch mal i ausgeben. Dann erhälst du Zahlen wie 10543.

    musicman schrieb:

    Stell mal die Warnungsstufe hoch, dann muß er schon warnen.

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.



  • C++Eus schrieb:

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.

    int i =1;
    //...
    if(i = 5)
    

    Das ist auch Standard-C++, trotzdem ist der Compiler so nett und weist darauf hin, dass es vielleicht nicht so gewollt ist!

    [edit]hab die Quote-Tags korrigiert[/edit]



  • Bleibt c++eus noch zu sagen, dass ich schon vor ihm auf den Semikolon-hinter-for-Schleife-Fehler gekommen bin.



  • 1. warnen darf ein Compiler so viel er will
    2. und der Zugriff auf nicht initialisierten Variablen ist `undefined behaviour` also nicht Standardkonform



  • c++eus schrieb:

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.

    Warnen darf er doch soviel und so wenig wie er will. zB ist
    if(i=0)
    in den meisten Fällen nicht gewollt. Deshalb fragt mich mein Compiler immer ganz nett: 'Ausdruck ergibt immer 'false'. Hast du wirklich = gemeint und nicht ==?'

    Solche Warnungen sind nicht nur völlig OK, sondern verdammt nützlich.
    zB auch:
    while(1);
    {
    }

    da fragt er mich dann 'Ist dieses leere Statement beabsichtigt?'

    Einen Fehler darf er mir aber nicht anzeigen - aber warnen soviel er will.



  • KPC schrieb:

    C++Eus schrieb:

    Aber dabei handelt es sich doch um gültiges Standard-C++, oder? Da dürfte er doch keine Warnung ausgeben.

    int i =1;
    //...
    if(i = 5)
    

    Das ist auch Standard-C++, trotzdem ist der Compiler so nett und weist darauf hin, dass es vielleicht nicht so gewollt ist!

    Damit hast du natürlich Recht. Aber ich denke, wenn er bei einer Schleife eine Warnung ausgiebt, müsste dann nicht auch bei einer "normalen", lokalen (nicht initialisierten) Variable eine Warnung asusgeben?

    [edit]Quote-Tags korrigiert[/edit][edit="zeus"]Danke.[/edit]



  • immer, aber wirklich immer wieder gern gesehen:

    class foo
    {
     private:
      TIrgendwas* Irgendwas;
     public:
     void Init()
      {
       if(Irgendwas)
         {
         // nun geht das Geheule los, warum Irgendwas immer true ist oder immer ungleich NULL
         }
      }
    };
    


  • AndreasW schrieb:

    immer, aber wirklich immer wieder gern gesehen:

    class foo
    {
     private:
      TIrgendwas* Irgendwas;
     public:
     void Init()
      {
       if(Irgendwas)
         {
         // nun geht das Geheule los, warum Irgendwas immer true ist oder immer ungleich NULL
         }
      }
    };
    

    Das ganze kann man umgehen, wenn man im Konstruktor Irgendwas mit NULL initialisiert. 🙂
    Aber du spielst wohl eher die Sache mit dem Dereferenzierungsoperator an.



  • Ich mein es schon wie es da steht. Viele Anfänger initialisieren ihre Variablen nicht und wundern sich später. Auch zerstören sie Objekte gern mit delete und prüfen später den Pointer auf !=NULL. Natürlich wurde der Pointer nie auf NULL gesetzt, weshalb die Anfänger m it schöne Zugriffsverletzungen belohnt werden, wenn SIe sich dann in sicherheit wiegen und munter den Pointer benutzen wollen.



  • Zwei richtig miese Anfängerfehler sind folgende:

    1.)

    for(int i = 0; i <= count; ++i) // autsch Bereichsüberschreitung!
        array[i] = 0;
    

    2.)

    for(int i = 0; i < sizeof(array); ++i) // autsch, wenn sizeof(array[0]) > 1
        array[i] = 0;
    

    Auch immer wieder beliebt sind Präprozessorfehler:

    #define XYZ (var1-var2)
    ...
    int XYZ = 0;
    
    #define MUL(a,b) a*b
    ...
    int c = MUL(a+1,b+1); // wird zu a+1*b+1 also a+b+1
    


  • naja, ging wohl eigentlich nur um Fehler die der Compiler meldet. Naja, ein weiterer beliebter Fehler ist

    #define MAX(a,b) (a>b?a:b)
    


  • kingruedi schrieb:

    Naja, ein weiterer beliebter Fehler ist

    #define MAX(a,b) (a>b?a:b)
    

    wobei ein Anfänger wohl keine Makros benutzt (zumindest unter C++). Er wird wohl inline beforzugen, da man es im gewohnten FunktionsDesing verwenden kann.



  • kingruedi schrieb:

    naja, ging wohl eigentlich nur um Fehler die der Compiler meldet.

    Exakt. Ich suche primär Fehler die der Compiler meldet - aber nicht immer ganz klar. So kommt bei einem ; nach einer class definition 'sinnlose' Fehler, die ja nur indirekt mit dem ; zu tun haben.

    Genau sowas suche ich.

    Aber die anderen Fehler kann man in ein Kapitel 'Pitfalls' sicher auch recht gut einpacken 🙂

    Danke für eure Mühe und nur weiter so! 👍 👍



  • oder:

    template <class T> class foo
    {
        public:
        foo();
    }; 
    foo::foo()
    {
    }
    

    11 C:\Dev-Cpp\main.cpp
    syntax error before `::' token

    wird auch gern genommen, genau wie die klassische Kombination von cpp-Dateien und templates. Aber das hat Shade bestimmt schon dabei...


Anmelden zum Antworten