assert + Fehlerbeschreibung



  • Hallo zusammen,

    habe vor einiger zeit angefangen c++ zu lernen und beschäftige mich derzeit mit
    dem assert-macro.
    Wie ich vor kurzem in einem C++-Buch gelesen habe, ist es möglich dem assert-macro eine Fehlerbeschreibung hinzuzufügen, die dann in der Fehler-MessageBox die in zB. Visual Studio erscheint, mit angezeigt wird.

    Ich habe hierzu folgendende Code geschrieben.

    ...
    #define assertmsg(a,b) assert( a && b )
    
    int value = 0; 
    assertmsg(value > 0, "Some error message");
    ...
    

    Ich programmiere wie gesagt mit Visual Studio 2008, und mein Problem ist nun das der angegebene Fehler string nicht in der Fehlermessagebox erscheint.
    Dort steht nur etwas von "Debug Error! usw usw" und ich kann dann eben ignorieren, wiederholen oder abbrechen.
    Ich frage mich nun ob es vielleicht an einer Einstellung in Visual Studio liegt oder ob ich sonst irgendetwas falsche mache 😞
    Vielleicht kann mir ja hier im Forum jemand einen Tipp geben 🙂

    Dankeschön
    Gruss
    Fingerhoff



  • Das funktioniert so nicht, weil der Kommaoperator zwar alle Ausdrücke (die durch Kommas getrennt werden!) auswertet, aber nur den ganz Rechts als Wert liefert und damit sieht das assert zum Auswerten nur den String bzw. einen Zeiger auf dessen Anfang.

    Wenn man Strings anzeigen will benutzt man folgenden Trick:

    assert(a < 0 && "hier ein beschreibender Text);
    

    Das geht mit so ziemlich jedem Compiler (ich kenne keinen bei dem es nicht geht), da assert normalerweise den Ausdruck mit in die Fehlerausgabe packt.



  • Tippgeber schrieb:

    Das funktioniert so nicht, weil der Kommaoperator zwar alle Ausdrücke (die durch Kommas getrennt werden!) auswertet, aber nur den ganz Rechts als Wert liefert und damit sieht das assert zum Auswerten nur den String bzw. einen Zeiger auf dessen Anfang.

    Wenn man Strings anzeigen will benutzt man folgenden Trick:

    assert(a < 0 && "hier ein beschreibender Text);
    

    Das geht mit so ziemlich jedem Compiler (ich kenne keinen bei dem es nicht geht), da assert normalerweise den Ausdruck mit in die Fehlerausgabe packt.

    Vergiss das, ich habe überlesen, dass du gar nicht direkt assert aufgerufen hast. Kannst du die Nachricht genau beschreiben und ein Beispiel posten, dass sie verursacht hat? Der beschriebene Dialog hört sich schon stark nach dem normalen Assert-Dialog an.



  • Hi Tippgeber^^,

    danke erstmal für die schnelle Antwort.

    also das hier ist der komplette code den ich zum testen geschrieben habe, eben einfach um zu sehen ob die Fehler-message, die ich angeben auch in der Dialog-box erscheint.:

    #include <iostream>
    #include <assert.h>
    using namespace std;
    
    #define assertmsg(a,b) assert( a && b )
    
    int main()
    {
    	int value = 0;
    	assermsg(value > 0 && "some error message");
    
    	return 0;
    }
    

    Mhh...jetzt wo du es sagst, ich glaube auch, dass es sich um den normalen Assert-Dialog handelt, aber ich habe eben gedacht, dass die Die Fehlermeldung genau dort mitangezeigt wird.
    Aber dort steht eben nur:

    Debug Error!
    Dann der Pfad zur asser.exe und drunter der Text:
    This application has requested the runtime to terminate it in an unusual way...blablabla. 😕



  • Das assermsg ist nur ein Tippfehler?

    Hm, wie du die MessageBox bei MSVC++ anpasst, weiss ich nicht. Vielleicht gibts bei der MSDN etwas. Oder du kannst ja mal schauen, wie es die Standardbibliothek (z.B. STL) macht, ich glaube, die hat ein eigenes Assert-Makro. Damit verlierst du jedoch die Plattformabhängigkeit. Oder du prüfst zuerst mit #ifdef ob man den MSVC++ benutzt und setzt sonst dein Assert-Makro auf das standardkonforme assert .

    Andererseits erhältst du ja eine Meldung in der Konsole mit dem gesamten Ausdruck, der sichergestellt wird (also auch deinen String). Zudem wird dann gleich die Codestelle angezeigt, in der die Assertion ausgelöst wird... Eventuell ginge sogar ein einfacher Kommentar.

    Du kannst natürlich auch wild konfigurieren:

    // vielleicht Bezeichner wählen, der weniger Namenskonfliktgefahr als ASSERT hat
    #define ASSERT(EXPR, MSG) std::cout << "Assertion-Beschreibung: " MSG << std::endl; assert(EXPR)
    
    ASSERT(3 < 3, "ich will, dass 3 kleiner als 3 ist!");
    

    Edit: Ach ja, ich würde den Header <cassert> statt <assert.h> benutzen, der ist nämlich offizielles Standard-C++.


Log in to reply