debug messages in ein macro auslagern



  • hallo, mir ist aufgefallen, dass an relativ vielen stellen des codes folgende blöcke

    #ifdef _DIAGNOSIS_
      settextcolor(3,0);
      printf("dbg message");
      settextcolor(15,0);  
    #endif
    

    vorkommen jetzt wäre meine frage ob es nicht evtl. schöner wäre daraus ein macro zu machen z.b. so

    #ifdef _DIAGNOSIS_
     #define kdebug(...)   \
      settextcolor(3,0);    \
      printf(__VA_ARGS__);  \
      settextcolor(15,0);
    #else
     #define kdebug(...)
    #endif
    

    lg lolo


  • Mod

    Danke für den konstruktiven Hinweis! Er wurde in Rev. 371 umgesetzt. Wieder ein paar Codezeilen gespart und an Übersichtlichkeit gewonnen. 🙂



  • Die Frage ist, ob alle Debug-Ausgaben einfarbig sein sollen... Das waren sie vorher nämlich wahrscheinlich nicht. Insofern brauchen wir auch einen Parameter für die (Vordergrund-)Farbe.
    Werd ich entsprechend einbauen.
    Ansonsten ist der Vorschlag natürlich wirklich gut 👍



  • In diesem Vorschlag fehlt noch das do { ... } while(0) außenrum. Ansonsten kann es leicht passieren, dass ein if (foo) kdebug("bar"); nicht das erwartete tut.


  • Mod

    taljeth: kannst du das bitte erläutern?



  • Auch wenn ich nicht taljeth bin 😃

    Aus:

    if (foo)
        kdebug("bar");
    

    wird (vereinfacht):

    if (foo)
        settextcolor(3,0);
        printf("bar");
        settextcolor(15,0);
    

    Ohne geschweife Klammern wird nur die erste Zeile als Rumpf angenommen. Steht dort direkt das do-while, wird der ganze Rumpf von diesem genommen.


  • Mod

    also so?

    #ifdef _DIAGNOSIS_
     #define kdebug(...) do{settextcolor(3,0);printf(__VA_ARGS__);settextcolor(15,0);} while(0)
    #else
     #define kdebug(...)
    #endif
    


  • Ja für den Teil, in dem _DIAGNOSIS_ definiert ist. Beim anderen besteht genau das umgekehrte Problem: Bei einem if würde der nächste Befehl plötzlich bedingt werden, obwohl das sicher nicht die Absicht war. Da würde ich also auch wieder ein leeres do {} while(0) hinsetzen.



  • taljeth schrieb:

    Ja für den Teil, in dem _DIAGNOSIS_ definiert ist. Beim anderen besteht genau das umgekehrte Problem: Bei einem if würde der nächste Befehl plötzlich bedingt werden, obwohl das sicher nicht die Absicht war. Da würde ich also auch wieder ein leeres do {} while(0) hinsetzen.

    es geht doch garnicht so genau darum wie das macro aussehen muß, solang es zentral mit einer veränderung angepasst werden kann ist doch alles ok

    btw. das macro sollte einen

    #ifdef _DIAGNOSIS_
      settextcolor(3,0);
      printf("dbg message");
      settextcolor(15,0);  
    #endif
    

    block ersetzen. da hätte ja sowas auch nicht geklappt oder 😕

    if(1)
    #ifdef _DIAGNOSIS_
      settextcolor(3,0);
      printf("dbg message");
      settextcolor(15,0);  
    #endif
    

    aber ja rein mit dem do{}while(0) bzw. {} stören wirds sicher nicht 😉

    lg lolo



  • Ach, wisst ihr was: Behaltet eure Bugs einfach, wenn ihr euch angegriffen fühlt, wenn man drauf aufmerksam macht.



  • taljeth schrieb:

    Ach, wisst ihr was: Behaltet eure Bugs einfach, wenn ihr euch angegriffen fühlt, wenn man drauf aufmerksam macht.

    Ich seh schon ihr habt Spaß 😃
    Ich nehme bei mir generell __FILE__ und __LINE__ ins Makro. "dbg message" ist nämlich ziemlich nichtssagend.
    Das do while hingegen verstehe ich nicht. Wieso nicht ein einfacher Block?

    #define kdebug(x) {\
        settextcolor(3,0); \
        printf("Debug in %s:%d: %s\n", __FILE__, __LINE__, x); \
        settextcolor(15,0); \
    }
    

    Dann kann man sagen kdebug("Versuche [irgendwas was wahrscheinlich schiefgeht]") und an der Ausgabe sieht man dann auch tatsächlich was.



  • nwp2 schrieb:

    Das do while hingegen verstehe ich nicht. Wieso nicht ein einfacher Block?

    #define kdebug(x) {\
        settextcolor(3,0); \
        printf("Debug in %s:%d: %s\n", __FILE__, __LINE__, x); \
        settextcolor(15,0); \
    }
    

    Wegen

    if(...)
      kdebug("bla");
    else
      printf("blubb");
    

  • Mod

    Kann mal jemand den kompletten Ausdruck hinschreiben, wie er jetzt zur Fehlerabsicherung aussehen muss? Zwei mal do/while?



  • Ich glaube, so ist das gemeint:

    #ifdef _DIAGNOSIS_
    	#define kdebug(...) do{\
    		settextcolor(3,0);\
    		printf(__VA_ARGS__);\
    		settextcolor(15,0);\
    	}while(0)
    #else
    	#define kdebug(...) do{}while(0)
    #endif
    

    oder mit nwp2

    #ifdef _DIAGNOSIS_
    	#define kdebug(...) do{\
    		settextcolor(3,0);\
    		printf("(von nwp2)Debug in %s:%d: ",__FILE__,__LINE__,);\
    		printf(__VA_ARGS__);\
    		settextcolor(15,0);\
    	}while(0)
    #else
    	#define kdebug(...) do{}while(0)
    #endif
    

    Und noch MrX beachten.

    //hab keine ahnung, wie man die farben wirklich liest. 
    #define _DIAGNOSIS_
    
    #ifdef _DIAGNOSIS_
    	#define kdebug(fcolor,bcolor,...) do{\
    		int ofcolor,obcolor;\
    		gettextcolors(&ofcolor,&obcolor);\
    		settextcolor(fcolor,bcolor);\
    		printf("(von nwp2)Debug in %s:%d: ",__FILE__,__LINE__);\
    		printf(__VA_ARGS__);\
    		settextcolor(ofcolor,obcolor);\
    	}while(0)
    #else
    	#define kdebug(fcolor,bcolor,...) do{}while(0)
    #endif
    


  • Dann könnten wir vlt. besser eine inline-Fkt. nehmen...



  • Mr X schrieb:

    Dann könnten wir vlt. besser eine inline-Fkt. nehmen...

    👍



  • Mr X schrieb:

    Dann könnten wir vlt. besser eine inline-Fkt. nehmen...

    Sogar outline. Aber das isses gar nicht mehr so kompliziert.

    #ifdef _DIAGNOSIS_ 
        #define kdebug(...) kdebugfunc(__VA_ARGS__)
    #else 
        #define kdebug(...) ((void(4711))
    #endif
    

Anmelden zum Antworten