Probleme mit Funktionsparser



  • Hallo,

    ich habe ein Problem mit dem Funktionsparaser von Th69. https://www.c-plusplus.net/forum/p1780654#1780654

    Habe ihn versucht mit VS 2015 zu complieren, dabei treten folgende Fehler auf:

    1>d:\entwicklung\test\projekt1\projekt1\fctparser.h(26): error C2380:
    > Typ(en) vor "fct" - Konstruktor mit Ergebnistyp oder unzulässige
    > Neudefinition eines Klassennamens?
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.h(26): error C2208:
    > "FunctionParser::fct": Keine Elemente definiert, die diesen Typ
    > verwenden
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.h(37): error C2380:
    > Typ(en) vor "op" - Konstruktor mit Ergebnistyp oder unzulässige
    > Neudefinition eines Klassennamens?
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.h(37): error C2208:"FunctionParser::op": Keine Elemente definiert, die diesen Typ
    > verwenden
    > 1>  FctParser.cpp
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(41): error C2078: Zu viele Initialisierungen
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(97): error C2440: "Initialisierung": "FctValue (__cdecl *)(FctValue,FctValue)"
    > kann nicht in "FunctionParser::op::OpType" konvertiert werden
    > 
    > 1>  d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(97): note: Der Kontext ermöglicht keine Eindeutigkeit für überladene Funktionen
    > 
    
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(97): error C2078: Zu viele Initialisierungen
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(169): error C2273: "Funktionsformatsumwandlung": Unzulässig auf der rechten  > Seite des Operators "->"
    > 
    > 1>d:\entwicklung\test\projekt1\projekt1\fctparser.cpp(195): error C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name: _stricmp. See online help for details.
    

    Die Fehler werden vermutlich von den markierten Codestellen im header verursacht:

    typedef FctValue (*Fct)(FctValue a);	// Funktionen f(x)
    
    	struct bracket
    	{
    		char bra, ket;
    	};
    
    	struct fct
    	{
    		const char *cFct;
    		Fct fct; <---
    	};
    
    	static fct aFct[];
    	static bracket bracketFct;
    
    	typedef FctValue (*Op)(FctValue a, FctValue b);	// Operatoren a <op> b;
    
    	struct op
    	{
    		char cOp;
    		Op op; <----
    		enum OpType { UNARY, BINARY } type;
    		OpPriority priority; // 0: least
    	};
    

    Weiß jemand auf die schnelle wie sich das ganze beheben lässt so das es ordentlich kompiliert wird?

    Bevor jemand sagt ich solle mich an den ersteller wenden, der ist schon informiert.



  • Benenn die Member um?



  • Bringt nix, hab ich schon ausprobiert.



  • Bringts total. Getestet.



  • Stimmt du hast recht. Dann hab ich wohl noch an anderer stelle einen Fehler gemacht.

    Dann wäre das auch geklärt.
    Danke für die Hilfe.



  • Oh, das ist mir gar nicht aufgefallen (der Borland C++ Builder Compiler 5.x hatte aber damit wohl keine Probleme).
    Bei meiner Neuimplementierung in C# (Parser für mathematische Formeln) heißen die Strukturen dann auch 'Operator' und 'Function'.

    @axels: Könntest du mir dann den fertigen Source-Code mailen (dann kann ich ihn auch hier verlinken, damit der Code up-to-date ist)?



  • Vllt verpackste das alles noch in einen eigenen namespace, dann ist da für immer Ruhe 😉



  • Nun habe ich es auch geschafft, die Sourcen entsprechend abzuändern: FctParser(std)-Sources.zip (zumindestens mit dem MSVC sollte es jetzt funktionieren - da ist die Nichtstandardfunktion '_stricmp' enthalten).

    Hier nochmal ein Beispielcode:

    FunctionParser fp;
    std::string sFct = "x*cos(x)-3*x^2"; // <- variabel
    FctValue x = 3.14; // <- variabel (z.B. in einer Schleife)
    try
    {
      FctValue y = fp.Parse(sFct.c_str(), x);
    }
    catch(const EFctParser& e)
    {
      std::cout << e.what();
    }
    

Anmelden zum Antworten