Kann erf, erff, etc. nicht finden beim Kompilieren mit 10.2



  • Hallo zusammen

    Ich versuche die C++ Mathematical Expression Library (http://www.partow.net/programming/exprtk/index.html) von Arash Partow zu kompilieren. Leider schaffe ich das mit 10.2 nicht wirklich. erf, erff, etc. werden nicht gefunden.... Ich sterhe komplett an.

    Das Projekt versuchte anzuhängen.... Geht leider nicht.

    Darum hier die Fehlermeldung(en)

    Preparing...
    Building...
    Build started 16.09.2020 17:04:12.


    Project "D:_Entwicklung.KEL\exprtk_new\Project2.cbproj" (Build target(s)):

    Target CreateProjectDirectories:
    Creating directory ".\Win32\Debug".
    Compiling C++ files...
    Target MakeObjs:
    Target TCCompile:
    C:\Program Files (x86)\JomiTech\TwineCompile\mtbcc32.exe -ide102 -priority0 -files="D:_Entwicklung.KEL\exprtk_new\twfiles.@@@"
    JomiTech TwineCompile 4.5 - Copyright JomiTech 2016. All Rights Reserved.
    Compiling 1 files...
    Embarcadero C++ 7.30 for Win32 Copyright (c) 1993-2017 Embarcadero Technologies, Inc.
    d:_Entwicklung.KEL\exprtk_new\File2.cpp
    File2.cpp: (0) 0 of 0
    File2.cpp: (0) 368546 of 368546
    d:_Entwicklung.KEL\exprtk_new\exprtk.hpp(1200,49): C++ error E2268: Call to undefined function 'erff'
    Warning: Full parser context

    Ich bin unterdessen einen Schritt weiter:
    Im C++ Builder habe ich in der Checkbox "Use 'classic' borland compile" den Haken entfernt.

    Nun erhalte ich - nach abschalten von TwineCompile - beim Compilieren der Sequenz

            #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER)
            #define exprtk_define_erf(TT,impl)           \
            inline TT erf_impl(TT v) { return impl(v); } \
    
            exprtk_define_erf(      float,::erff)
            exprtk_define_erf(     double,::erf )
            exprtk_define_erf(long double,::erfl)
            #undef exprtk_define_erf
            #endif
    

    den Fehler:
    [bcc32c Error] exprtk.hpp(1198): no member named 'erff' in the global namespace

    So habe ich folgendes versucht:

            using namespace std;
            #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER)
            #define exprtk_define_erf(TT,impl)           \
            inline TT erf_impl(TT v) { return impl(v); } \
    
            exprtk_define_erf(      float,::erff)
            exprtk_define_erf(     double,::erf )
            exprtk_define_erf(long double,::erfl)
            #undef exprtk_define_erf
            #endif
    

    Dann erhalte ich:
    [bcc32c Error] exprtk.hpp(1199): no member named 'erff' in the global namespace

    Nun versuchte ich:

            #if (defined(_MSC_VER) && (_MSC_VER >= 1900)) || !defined(_MSC_VER)
            #define exprtk_define_erf(TT,impl)           \
            inline TT erf_impl(TT v) { return impl(v); } \
    
            exprtk_define_erf(      float,std::erff)
            exprtk_define_erf(     double,std::erf )
            exprtk_define_erf(long double,std::erfl)
            #undef exprtk_define_erf
            #endif
    

    ==> [bcc32c Error] exprtk.hpp(1198): no member named 'erff' in namespace 'std'

    Ich bin wirklich ratlos... Wie kriege ich das Ding zum Kompilieren?



  • So so, sehr interessant.



  • @hustbaer Habe ich was falsch gemacht?



  • @aekeller
    Der Author der Lib hat diese garantiert nicht im Builder mit deren Frankenstein clang Version getestet.
    Soweit ich das beurteilen kann bleibt dir nur die angemerkten Fehler selbst zu identifizieren und zu fixen / ein workaround zu baun.



  • Mach ma den TwineCompile aus und versuche die Quelldateien einzeln zu übersetzen. Wenn der Compiler dann Fehler meldet poste den einzelnen Fehler, und bitte keine 400 Zeilen Textwand.



  • @5cript sagte in Kann erf, erff, etc. nicht finden beim Kompilieren mit 10.2:

    @aekeller
    Der Author der Lib hat diese garantiert nicht im Builder mit deren Frankenstein clang Version getestet.
    Soweit ich das beurteilen kann bleibt dir nur die angemerkten Fehler selbst zu identifizieren und zu fixen / ein workaround zu baun.

    Die Website sagt kompatibel mit clang 1.1





  • @DocShoe Das mache ich.... Danke für den Hinweis



  • @aekeller sagte in Kann erf, erff, etc. nicht finden beim Kompilieren mit 10.2:

    @hustbaer Habe ich was falsch gemacht?

    Zwei Dinge:

    • Du hast keine Frage gestellt
    • Du hast keine Code-Tags verwendet

  • Mod

    Und vor allem auch: Keine 400 Zeilen Fehlermeldungen posten, von denen 380 sich ständig wiederholen! Da hat man als Leser doch spätestens nach 50 Zeilen keine Lust mehr. Siehe: https://www.c-plusplus.net/forum/topic/200753/du-brauchst-hilfe, besonders aus dem zweiten Teil:

    Grundsätzlich solltest du immer die Fehlermeldung mit angeben, allerdings auch nur eine, nicht einen ganzen Haufen. Nach einem Fehler sind andere Fehlermeldungen häufig Folgefehler, auch wenn man das nicht auf den ersten Blick sieht. Versuche auf jeden Fall, die Meldung zu verstehen, um zu wissen, was zum Fehler gehört und was nicht.



  • @hustbaer und @SeppJ : Jep... ich sehe was ich falsch gemacht habe.... Gelobe Besserung.



  • ^Ich habe nun meine Anfrage überarbeitet, nochmals verschiedene Dinge ausprobiert und bin einen kleinen Schritt weiter, aber noch nicht am Ziel. Ich hoffe, ich kriege nochmals ein Chance... Mein zusätzlichen Versuche sind all in der ursprüngelichen Anfrage dokumentiert.



  • Nach kurzem Blick in den Quelltext:
    Es gibt std::erf im Standard, allerdings kein erff und erfl. Möglicherweise sind das Microsoft-spezifische Erweiterungen, die nicht im Standard enthalten sind. Kommentier die beiden Zeilen (ab Zeile 1200) einfach aus

    // exprtk_define_erf(      float,::erff)
       exprtk_define_erf(     double,::erf )
    // exprtk_define_erf(long double,::erfl)
    


  • Doch diese sollten alle im Standard sein: std::erf, std::erff, std::erfl

    @aekeller: Schau mal in die cmath von deinem C++ Builder und suche mal nach erf. Evtl. mußt du noch ein Makro dafür setzen. Kompilierst du denn mit C++11 (oder höher)?

    Edit: Laut How to set C++ language standard in C++ Builder unterstützt C++ Builder 10.2 C++11 automatisch und erst ab 10.3 gibt es Compileroptionen für die verschiedenen Sprachstandards.



  • // exprtk_define_erf(      float,::erff)
       exprtk_define_erf(     double,::erf )
    // exprtk_define_erf(long double,::erfl)
    

    Das habe ich gemacht.... nun bin ich einen Schritt weiter:

    [ilink32 Error] Fatal: Exceeded memory limit for block Publics in module File2.cpp

    Und File2.cpp enthält:

    #pragma hdrstop
    #pragma argsused
    
    #ifdef _WIN32
    #include <tchar.h>
    #else
      typedef char _TCHAR;
      #define _tmain
    ``` main
    #endif
    
    using namespace std;
    #include "exprtk.hpp"
    
    template <typename T>
    void trig_function()
    {
       typedef exprtk::symbol_table<T> symbol_table_t;
       typedef exprtk::expression<T>     expression_t;
       typedef exprtk::parser<T>             parser_t;
    //
       const std::string expression_string =
                         "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";
    
       T x;
    
       symbol_table_t symbol_table;
       symbol_table.add_variable("x",x);
       symbol_table.add_constants();
    
       expression_t expression;
       expression.register_symbol_table(symbol_table);
    
       parser_t parser;
       parser.compile(expression_string,expression);
    //
       for (x = T(-5); x <= T(+5); x += T(0.001))
       {
          const T y = expression.value();
          printf("%19.15f\t%19.15f\n", x, y);
       }
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
       trig_function<double>();
       int result = 0;
    
       return result;
    }


  • Willkommen in der wunderbaren Embarcadero Welt ...
    Guck mal hier, da steht beschrieben, wie man dem Linker mehr Speicher zuteilen kann

    PS:
    Die Dinkumware STL Implementation ist wohl unvollständig, ich habe in xtgmath.h nur die Deklaration von erf und erfc gefunden. Ist mir bei ein paar anderen Funktionen aus cmath auch schon aufgefallen.



  • @DocShoe Vielen Dank für den Hinweis. Ich kann dem Linker mehr zuteilen. Doch es gibt keine Section für den "Block Publics".



  • @aekeller

    Schade zu hören 😞
    Die Embarcadero Suite ist und bleibt halt ein Stümperprodukt.



  • @DocShoe sagte in Kann erf, erff, etc. nicht finden beim Kompilieren mit 10.2:

    @aekeller

    Schade zu hören 😞
    Die Embarcadero Suite ist und bleibt halt ein Stümperprodukt.

    Tja, würde mal sagen, die Ideen sind gut, die Umsetzung jedoch leider wirklich stümperhaft, die IDE ist grauenhaft instabil (und immer noch nur in 32 Bit) und funktioniert wohl nur richtig mit sehr kleinen Projekten, sobald es mehr Dateien werden, funktioniert kein Codecompletion etc.

    Vermutlich haben einfach zu viele Entwickler daran gearbeitet, die nie lange geblieben sind.

    Gibt ja auch das Sprichwort "Zu viele Köche verderben den Brei."



  • @Burkhi sagte in [Kann erf, erff, etc. nicht finden beim Kompilieren mit 10.2](/forum

    Vermutlich haben einfach zu viele Entwickler daran gearbeitet, die nie lange geblieben sind.

    Sowas macht den Code nicht besser, das ist klar. Ist aber nicht nötig. Die meisten Entwickler haben das auch ganz gut drauf Programme zu verkacken an denen sie schon lange arbeiten.