matherr im c++ style einbinden
-
BCB 2010
-
mcam77 schrieb:
Wenn ich die wie in dem Beispiel versuche einzubinden bekomme ich entweder die Fehlermeldung das sie bereits definiert ist, oder aber(nach leichter Änderung), wird sie nicht aufgerufen.
Nur gut, dass du weder die Fehlermeldungen noch den dazu passenden Code zeigst, vielleicht hätten wir sonst den Fehler gefunden!
Das Beispiel ist jedenfalls C. Wenn du in deinem C++ Code kein extern "C" davor geschrieben hast, könnte das eine Erklärung sein.
Hat die Doku etwas mit BCB zu tun?
-
Header:
int _matherr(struct exception* e); class TForm1 : public TForm { __published: // IDE-verwaltete Komponenten TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // Benutzer-Deklarationen public: // Benutzer-Deklarationen __fastcall TForm1(TComponent* Owner); }; //--------------------------------------------------------------------------- extern PACKAGE TForm1 *Form1; //--------------------------------------------------------------------------- #endifC++:
void __fastcall TForm1::Button1Click(TObject *Sender) { double te=pow(0,0); } int _matherr(struct exception* e){ return 0; }extern C in versch. variationen vor _matherr(in header und/oder cpp) bringt:
[BCC32 Fehler] Unit1.cpp(26): E2167 '_matherr(exception *)' wurde bereits mit dem Sprachmodifizierer 'C++' deklariertdas kommt im übrigen auch wenn ich es wie in dem Beispiel mache.
@manni, was meinst du mit Doku und BCB? Das ist die Doku vom Hersteller(Embarcardero) des C++ Builder
-
Mal ne blöde Frage, warum willst du eigentlich pow(0,0) als Fehler abfangen? Das ist doch einfach (definiert als) Eins. Aber wahrscheinlich war das nur ein unglückliches Beispiel

-
mcam77 schrieb:
Ich brauche das Ding, weil so Fälle wie pow(0,0) auftreten können, und ich die nicht wirklich alle abfangen will.
Die übliche Vorgehensweise wäre aber schon, mögliche Fehler zur Zeit ihrer Ursache abzufangen. Das wäre hier die Programmeingabe. So kann man passend reagieren. Ein Handler für die Exception in der Mathefunktion selbst kommt hingegen zu spät. Was soll der denn deiner Meinung nach noch machen?
-
happystudent schrieb:
Mal ne blöde Frage, warum willst du eigentlich pow(0,0) als Fehler abfangen? Das ist doch einfach (definiert als) Eins.
...wirklich blöde Frage :p
-
Wolfram|Alpha schrieb:
...wirklich blöde Frage :p
0^0 = 1 per Konvention. Ansonsten ist der binomische Satz, die Taylorreihe und etliche andere Formeln auch nicht definiert und bräuchten eine Sonderbehandlung. Macht aber keiner, da jeder 0^0 = 1 implizit so definiert, auch in C++ pow.
Probiers aus:
std::cout << pow(0, 0); // Output: 1Wolfram Alpha hat es hier versäumt darauf hinzuweisen. Wolfram Alpha wiederspricht sich hier übrigens selbst, wenn du etwa die Definition des Binomischen Satzes oder die Binomial Koeffizienten anschaust, wird dort munter mit der impliziten Definition von 0^0 = 1 gearbeitet.
Also nicht alles glauben was da so steht

-
mcam77 schrieb:
@manni, was meinst du mit Doku und BCB? Das ist die Doku vom Hersteller(Embarcardero) des C++ Builder
Ist BCB = RADStudio? Ich kenn das Zeug nicht.
Warum deklarierst du die Funktion in deinem Header?
Möglicherweise haben die Pappnasen eine Verwendung in einem C++ Programm nicht vorgesehen. Probiere
- cmath statt math.h
Wenn das nicht hilft - schreibe in math.h und in deinem cpp extern "C" vor die Funktion
- cmath statt math.h
-
Wolfram|Alpha schrieb:
happystudent schrieb:
Mal ne blöde Frage, warum willst du eigentlich pow(0,0) als Fehler abfangen? Das ist doch einfach (definiert als) Eins.
...wirklich blöde Frage :p
dort wird in keiner Weise darauf hingewiesen, warum das nicht definiert ist. Der Absatz im Wiki - insbesondere die Graphik sind da wesentlich erhellender.
Es kommt also drauf an, von welcher Seite man sich nähert.
Damit liegen sowohl Wolfram als auch happystudent irgendwie richtig.
-
Hallo mcam77,
laß mal den Prototypen von _matherr in der Header-Datei weg und binde <math.h> im Source-Code ein - und dann definiere die _matherr vor dem Aufruf!
Hier noch ein anderer Link dazu: matherr
PS: @Sepp, in der _matherr kann man mittels des Rückgabewerts bestimmen, ob die Verarbeitung (evtl. mit einem geänderten Wert) weiterlaufen soll (_matherr exception != C++ exception ;-).
-
Das da oben ist natürlich nur ein Beispiel! Da hängt ein ganzer Parser davor, und da müsste ich sämtliche Eventualitäten abfangen.
Mir is es völlig Wurst , ob da 0,0 rauskommt, Hauptsache, ich bekomme net 100 mal die Sekunde nen Domainerror
lg
-
@Th69 funzt leider auch nicht, kompiliert zwar, aber die Funktion wird nich angesprungen

Den matherr link hatte ich auch schon gefunden, nur leider bekomm ich das mit dem BCB net kompiliert, bzw nach Kürzung kompiliert er zwar, aber die Funktion wird immer noch net aufgerufen.
@manni
extern C will partout net, je nach Konstellation
[BCC32 Fehler] math.h(88): E2337 Nur eine aus einer Gruppe von überladenen Funktionen darf "C" sein bei z.B:
extern "C" int _matherr(struct exception* e){ return 0; } #include <math.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { double te=pow(0,0); }
-
Ich schrieb: vor dem Aufruf, nicht vor dem #include!
#include <math.h> //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- int _matherr(struct exception* e) { return 0; } void __fastcall TForm1::Button1Click(TObject *Sender) { double te=pow(0,0); }
-
Th69 schrieb:
PS: @Sepp, in der _matherr kann man mittels des Rückgabewerts bestimmen, ob die Verarbeitung (evtl. mit einem geänderten Wert) weiterlaufen soll (_matherr exception != C++ exception ;-).
Der Begriff "Exception" ist hier überladen.
-
Ich habe zwischenzeitlich nen besseren parser gefunden, der meine Zwecke besser erfüllt und auch mit try/catch klarkommt.
Habe da zwar auch ein Prob, mache aber nen neuen Fred auf.
THX für die Hilfe!
Hir noch der Link, wens interessiert.
http://www.codeproject.com/Articles/7773/Fast-Mathematical-Expressions-Parser#idExample
lg
-
Was hast du überhaupt vor? Deine gezeigte Lösung hat ja mal überhaupt nichts mit dem zu tun, wonach du gefragt hast. Hier liegt offensichtlich ein XY-Problem vor. Du willst X und denkst, dazu brauchst du Y. Obwohl Y völlig falsch ist, wenn man X möchte. Du fragst nach Y, alle sind verwirrt, denn sie sehen keine Sinn, jemals Y zu wollen und es werden 2 Seiten voller Hilfsbereitschaft verschwendet, um dir das eigentliche X aus der Nase zu ziehen. Du bekommst dabei keine Lösung für dein eigentliches Problem und die freiwilligen(!) Helfer sind frustriert und ignorieren in Zukunft den Thread (oder wenn es schlimm kommt: Alle deine Threads).
Also raus mit der Sprache: Was willst du eigentlich? Irgendwas mit dem Parsen von mathematischen Ausdrücken? Beantworte diese Frage ruhig in deinem neuen Thread.
-
Hatte ich vorher eig. getippt. Es geht um einen Parser, der verschiedene Mathematische Ausdrücke (Oh Wunder) parst=Y.
Der Parser macht was er soll, bis er auf so Ausnahmen stößt, wie pow(0,0)=X=matherr.
Da ich ständig Werte von dem Parser Abfrage, bekomm ich ständig Domain-Errors(math.h), und habe jetzt versucht mit matherr=X das Problem abzufangen.
Da ich das nicht hin bekommen habe, hatte ich die Frage hier eingestellt.Zugegeben, ich hätte mehr infos schreiben können. Bin halt davon ausgegangen, das matherr schonmal in C++ verwendet wurde, bzw. der Weg relativ simpel is

Also Sry!lg