2016-12-24 3 views
0

Ich habe gerade angefangen mit MuParser zu spielen - scheint eine wirklich coole Bibliothek zu sein! Ich bin jedoch beim Analysieren des folgenden Ausdrucks fest. Kann jemand aus dem Codeausschnitt unten sehen, wo ich falsch liege? Was immer 'zählen' ist, das Ergebnis scheint immer 0 zu sein.C++ MuParser Parsing verhält sich nicht wie erwartet

mu::Parser parser; 

string rule = "(n%10==1&&n%100!=11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2)"; 
parser.DefineConst("n", count); 
parser.SetExpr(rule); 
int retVal = parser.Eval(); 

Vielen Dank!

+0

Tatsächlich scheint der Ausdruck unerfüllbar, nicht wahr? –

Antwort

0

also, ich denke, dass Ihr Code falsch ist. es zur Laufzeit fallen. Sie können Ihren Code in try {} catch {} setzen, um Ihr Problem zu finden. zum Beispiel:

 try 
{ 
    mu::Parser parser; 
    string rule = "(n%10==1&&n%100!=11?0:n%10>=2&&n%10<=4&&(n%100<10||n%100>=20)?1:2)"; 
    parser.DefineConst("n", count); 
    parser.SetExpr(rule); 
    int retVal = parser.Eval(); 

    std::cout << retVal << std::endl; 

} 
catch (Parser::exception_type &e) 
{ 
    std::cout << e.GetMsg() << std::endl; 
} 
+0

Das ist seltsam. Der Block Code, den ich gepostet habe, ist tatsächlich mit einem Versuch/Fang verpackt. Es hat nicht für mich geworfen, aber du sagst es für dich? Außerdem habe ich den Ausdruck im Debugger zur Laufzeit ausgewertet, wobei n für 0 ausgetauscht wurde und 2 als Ergebnis erhalten wurde, was ich erwarten würde. Ich werde überprüfen ... – user7227230

+0

Okay. Das ist verrückt. Also habe ich es erneut ausgeführt und ich bekomme jetzt eine Ausnahme, wie du an Position 2 sagst, also sieht es so aus, als ob es das Mod '%' Symbol nicht mag. Ist für Mods etwas Setup nötig? – user7227230

+0

Ah. Es sieht so aus, als ob der Mod-Operator nicht unterstützt wird - https://github.com/beltoforion/muparser/issues/20 Das ist eine Schande. Ich frage mich, ob es eine einfache Möglichkeit gibt, dies hinzuzufügen/zu erweitern? – user7227230

1

Für interessierte niemanden. Ich fügte einen Modulo-Operator hinzu, indem ich folgendes hinzufügte:

parser.DefineOprtChars("%"); 
parser.DefineOprt("%", moduloOperator, mu::prINFIX); 

double moduloOperator(double v, double w) { 
     return (int)v % MAX(1, (int)w); 
}; 
+0

Ja. Ich habe Ihren Code ausgeführt und mein Fehler war nicht definiert Symbol "%". –

Verwandte Themen