gängige Anfänger-Fehler?



  • Hallo Leute!

    Ich stelle gerade eine Liste von Anfänger-Fehlern zusammen und was der Compiler dazu sagt (gcc, bcc, vc++)

    Bitte ergänzt die Liste mit dem was euch noch einfällt:

    ; vergessen
    Variable in einem case definiert, aber keinen Block aufgemacht
    Klasse obj(); statt Klasse obj;
    vector<int>::const_iterator i; vec.erase(i);
    void bar(T&); T const& r=foo; bar(r);
    T* p; p.foo();
    T& foo() { T t; return t; } (kein Fehler, aber Warnung)
    string name="foo"; ofstream file(name);
    funktion, klasse, whatever bereits definiert (ODR verletzung)
    unresolved external reference to... (lib vergessen zu linken/vergessen zu implementieren)
    void foo(); { cout<<"hallo"; } (; nach funktionskopf)
    std:: vergessen (namensraum)
    class foo { int i=3; }; (i nicht im ctor initialisiert)
    class foo {} (; nach deklaration vergessen)

    Was ich damit bezwecken will: ich will die Fehlermeldungen die GCC, BCC und VC++ dabei generieren aufschreiben, so dass es für einen Anfänger leichter ist, sich mit den Fehlern die, der Compiler liefert, vertraut zu machen. Hierbei geht es aber nur um Anfängerfehler - und nur die gängigsten (bzw. die am schwersten zu verstehensten).

    Es wäre also nett, wenn ihr ein paar Fehler beisteuern könntet 🙂 danke!



  • Hi,

    was mir schon ein paar mal passiert ist:

    if(....);
       wird_ja_nie_aufgrund_der_bedingung_ausgefuehrt();
    

    Weiss jetzt allerdings nicht, ob der Compiler ne Meldung wirft.

    switch(x)
    {
         case a: //anweisungen
                 break;
         case b: int i = 5; //variablendefinition innerhalb switch-block
                            //hier muss natuerlich dann ein neuer block begonnen
                            //werden
                 break;
    }
    

    Hmmm...mehr faellt mir ma grad so net ein, hoffe aber, dass das schon mal ok
    ist 😉

    mfg
    v R



  • Ein klassischer Anfängerfehler ist auch breaks nach cases zu vergessen obwohl man sie eigentlich benötigen würde. (Der Compiler sagt dazu leider klarerweise nichts... 🙂 )
    Oder bei STL-Funktionen die Präfixe entgegennehmen diese als myPrefix() statt als myPrefix zu übergeben...



  • if (x = y)
    

    statt

    if (x == y)
    


  • Ringincludes sind auch fies.

    a.h in b.h includen und b.h in a.h includen. Passiert zwar nicht nur Anfängern, aber die wissen am wenigsten, was ihnen da passiert sein könnte.



  • for(int i=0; i<10; ++i);
    

    Arrayindex mit 1 beginnen statt mit 0 (hinten Speicherüberschreitung)



  • Also Variablen innerhalb eines Case-Zweiges geht doch

    Für das if (x = 9)-Problem würd ich einfach als Tipp schreiben,dass man sich
    angewöhnen soll if (9 == x) zu schreiben



  • Hi,

    virtuell Realisticer schrieb:

    Hi,

    was mir schon ein paar mal passiert ist:

    if(....);
       wird_ja_nie_aufgrund_der_bedingung_ausgefuehrt();
    

    Weiss jetzt allerdings nicht, ob der Compiler ne Meldung wirft.

    gute Compiler tun das:

    warning C4390: ';': Leere kontrollierte Anweisung aufgetreten; ist dies beabsichtigt?

    Manchmal macht man das ja aber auch absichtlich, v.a. bei while()-Schleifen.

    ChrisM



  • Hi,

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

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


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



  • 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



  • 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


Anmelden zum Antworten