[Suchen Autor für:] Bugs bei denen man lange sitzt



  • Hallo

    ja mit dem virtual kann man tolle Fehler machen, vor allem wenn es vom Konstruktor oder Destruktor aufgerufen wird

    class Base
    {
      Base()
      {
        Build();
      }
      virtual void Build()
      {
        std::cout << "Base::Build" << std::endl;
      }
    };
    
    class Child : public Base
    {
      Child() : Base()
      {
      }
      virtual void Build()
      {
        Base::Build();
        std::cout << "Child::Build" << std::endl;
      }  
    };
    ...
    Child test;
    

    Man wundert sich erstmal warum nur Base::Build aufgerufen wird...
    Virtuelle Funktionen sollten niemals die Arbeit von Konstruktor und Destruktor übernehmen.

    bis bald
    akari



  • Es würde durchaus Hilfreich sein wenn man zu den geposteten Fehler mal Informationen liefert.

    Wenn man vorher / nachher zeigt, wird der eigentliche Fehler nur denen klar, die danach nicht lange suchen würden. Diese Sammlung soll ja wohl weniger eine Auflistung von pralerei sein sondern anderen Helfen solche Fehler zu vermeiden. Und da ist es unumgänglich das man erläutert, wo das Problem im gezeigten Code besteht.



  • class A{
    public:
    virtual void foo()const;
    };
    
    class B:public A{
    public:
    virtual void foo();
    };
    
    //...
    const A*a=new B;
    a->foo(); // Ruft A::foo und nicht B::foo auf.
    


  • Meines Erachtens wäre etwas zu Kopierkonstruktor und überladenem Zuweisungsoperator bei Klassen mit Zeigern als Membern noch nützlich... Da passiert es auch sehr schnell, dass man die Übersicht verliert.
    Oder eventuell auch sonstige, häufige Zugriffsverweigerungen bei der Arbeit mit Zeigern (ich weiss jetzt gerade keine guten Beispiele). Oder Funktionen, die Referenzen auf lokale Variabeln zurückgeben, und solche Sachen...



  • "Nur triviale Programme sind völlig bugfrei zu schreiben!" Möglichkeiten für Fehler, die der Compiler und der Linker nicht erkennen, gibt es viele. Dann heisst es Debuggen und Suchen. Einen Artikel für "alles" zu schreiben, erscheint mir nahezu unmöglich. Ich hatte zu Zeiten ohne Debugger in einer Schleife den Fehler, die Laufvariable i mit der Konstante 1 zu vertauschen. Das Programm lief, nur lieferte es Schrott. Ich habe lange in den Sourcelisten gesucht und nichts gefunden. Ein Arbeitskollege wurde dann fündig. Folgerung: Wir sollten besser über Regeln zur sauberen wartungsfreundlichen Programmierung nachdenken, die wir anderen mitteilen können. Hierzu könnte ich etwas beitragen aus meinen persönlichen Programmierstil.



  • berniebutt schrieb:

    Ich hatte zu Zeiten ohne Debugger in einer Schleife den Fehler, die Laufvariable i mit der Konstante 1 zu vertauschen.

    hast du die 1 in der schleife mit einer anderer konstanten verglichen? in dem fall sollte ein guter compiler warnen, dass der vergleich immer true oder false ergibt und daher rausfliegt.

    berniebutt schrieb:

    Wir sollten besser über Regeln zur sauberen wartungsfreundlichen Programmierung nachdenken, die wir anderen mitteilen können.

    genau. hier kommt schon mal eine regel: man wähle im editor immer einen zeichensatz, bei dem auch ein halbblinder nichts verwechseln kann.
    🙂



  • Das Thema "Sauberes wartungsfreundliches Programmieren" lässt sich einfach nicht mit einem einzelnen Artikel im Magazin abhandeln. Dazu ist die Aufgabe zu komplex! Es gibt aber durchaus hilfreiche Regeln, die offen diskutiert werden können.



  • Ja, dann immer her damit. Auch wenn sich noch kein Autor gemeldet hat, der Thread ist auch so schon interessant. 🙂



  • Kann ich machen! Nur mit immer noch gültigen einfachen Regeln aus den Anfängen der Programmierung.



  • hey, eine Fehlersammlung!;)

    Gesammelte Fehler sind gut, ich protokolliere meine eigenen so gut es geht, geht
    aber aus (manchmainekstaseprogrammiergründen) nicht immer.

    Fehler, die mir öfter unterlaufen u.a.:
    (hier:asmcode für ein Com-Programm)

    org 100h
    
    Nachricht DB "Fehler gefunden!"
    
    mov ah,09
    mov dx,Nachricht
    int 21
    
    Ende:
    int 20h
    

    Doch mit dem sehr einsteigerfreundlichen und leistungsfähigen Flat Assembler
    Fasm (hier: Fasmw) sind sind die Bugs schnell aufgepiekst...:)

    org 100h                     ;256 Byte(100hex) großer Präfix wird übergangen
    
    mov ah,09                           ;Funktion 09 gibt Zeichenkette ab Adresse 
                                        ;in DX aus 
    mov dx,Nachricht                    ;Haustür der Zeichenkette nach DX
    int 21h                             ;SystemSubroutine 21h anrufen
    int 20h                             ;Systemaufruf zum Beenden für Com-Programme
    
    Nachricht DB "Fehler gefunden!$"    ;ASCII-Datenstring, das Ende der
                                        ;Hausdurchsuchung wird mit $ bzw 24h 
                                        ;markiert
    

    Los Leute, sammelt mit, jetzt zur Osterzeit macht doch die Sucherei besonders viel Spaß 😉



  • ...
    class abc
    {
     public:
      abc();
    
      void A();
      void B();
    
     private:
      int i;
    }    //Hier wurde das Semikolon vergessen
    ...
    

    Dank des fehlenden Semikolons hab ich teilweise schon Stunden gebraucht wo der Fehler liegt, da der abgebrochene Kompiliervorgang mir mit einem Fehler in einer Methode quittiert wurde..


Anmelden zum Antworten