Exceptionhandling fuer math.h



  • Hallo,
    ich hoffe mir kann jemand bei diesem Problem helfen.
    Ich arbeite mit dem B-Builder 6.0 unter WinXP.

    Laut meiner Literatur ist es unter C++ nicht möglich eine Exception aufzurufen, falls in einer Standardbiblio. von ANSI-C ein Fehler auftritt.
    Mich interessiert hier genauer die math.h.

    Die genannte Literatur:C++ mit dem Borland Builder von R.Kaiser

    Da steht zwar, dass ich die Funktion:

    int _RTLENTRY  _matherr(struct _exception  *e)
    

    durch eine eigene ersetzen kann und somit das Exceptionhandling für diesenFall möglich wird.
    Nur leider bekomme ich den Fehler:"Fehler in der Deklarationssyntax!"
    Die ursprüngliche Deklaration in der Math.h habe ich gefunden und übernommen:

    int _RTLENTRY  _matherr(struct _exception  *__e)
    

    bekomme aber selbige Fehlermeldung.
    Ziel der Sache ist es Bereichsüberschreitungen u.a. der Funktionen pow(double, double) und sqrt(double) abzufangen.

    Vielen Dank für eure Hilfe.

    DerHorst



  • Hallo

    Ich glaube nicht das dieses Problem BCB-spezifisch ist. Ich verschiebe dich mal ins C++ Forum.

    bis bald
    akari



  • Dieser Thread wurde von Moderator/in akari aus dem Forum VCL (C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich denke das ist schon BCB-spezifisch. In der BCB6-Hilfe zu _matherr steht doch alles Notwendige. Die korrekte Signatur für _matherr ist

    int _matherr(struct _exception *e);
    

    In der Hilfe gibt es sogar ein Beispiel.



  • @Braunstein: Danke für den Tip!
    Da ich immer unter RTL...dingens gesucht habe, habe ich in der Hilfe nix gefunden.
    Jetzt tut sich aber ein anderes Problem auf.

    Angeblich ist type kein Element von Exception, obwohl in der math.h:

    struct  _exception
    {
        int type;
        char   _FAR *name;
        double  arg1, arg2, retval;
    };
    

    Meine matherr-Funktion sieht folgendermaßen aus:

    int _matherr (struct _exception *e)
    {
    if (e->type == TLOSS)
        {
        //Das gelieferte Ergebnis ist bedeutunglos:
        throw EMathError("TLOSS - Ergebnis Bedeutungslos: "
                        +AnsiString(e->name)
                        +"("+FloatToStr(e->arg1)+","
                        +"("+FloatToStr(e->arg2)+")");
        }
    else if ...
    }
    

    Das kann ich mir nicht erklären 😕



  • Ich auch nicht. Bei mir funktioniert deine Funktion problemlos.
    Das _FAR muss bei der Deklaration übrigens weg.



  • versuch mal selber einen datentyp exception zu bauen. Der compiler sollte sich darauf eigentlich beschweren und dir zeigen wo exception schon definiert wurde. Vielleicht wird deine angenommene Definition durch ein #ifdef verdeckt etc.



  • 🙂
    Es funktioniert nur, wenn die math.h auch in dieser Datei includiert wird.
    Ich hatte die math.h vorher nur in meiner "myinclude.h" und diese dann in die Datei mit der neuen Exception-Funktion eingebunden. Das funtioniert nicht.

    Ist das ein Denkfehler von mir:
    Oft benötigte Header in einer "myinclude.h" datei includieren und dann nur noch diese in die entsprechenden Dateien einbinden? Ich dachte immer das funzt !
    😕

    Trotzdem Dank euch allen!

    DerHorst



  • Das mit der myinclude soltte auch so gehen. Das ist aber meiner Meinung nach eine eher schlechte Idee. Man sollte nur das include was man wirklich braucht, sonst verlängern sich die Compilezeiten ganz schön. Header die man öfters benötigt, und die sich nie ändern kann man als precompiled header (oberhalb von #pragma hdrstop) reinziehen.
    http://web.archive.org/web/20031207214613/bcbdev.com/articles/pch.htm


Anmelden zum Antworten