2016-12-24 197 views
0

我刚开始玩MuParser - 看起来像一个非常酷的库!但是,我坚持解析下面的表达式。任何人都可以从下面的代码片段中看到我要出错的地方吗?无论“计数”是什么结果总是似乎是0?C++ MuParser解析不像预期的那样运行

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(); 

谢谢!

+0

的确,表达式似乎不可满足,不是吗? –

回答

0

所以,我认为你的代码是错误的。它在运行时下降。 你可以把你的代码放在try {} catch {}中找到你的问题。 例如:

 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

这很奇怪。我发布的代码块实际上是用try/catch包装的。它不是为我而投掷,但你说它对你有用吗?另外,我在调试器中评估表达式,在运行时将n换为0,并得到2,这是我所期望的结果。我会仔细检查... – user7227230

+0

好的。太疯狂了。所以我已经重新运行了,现在我得到它来抛出一个异常,就像你在位置2所说的那样,它看起来不像mod'%'符号。是否有一些设置需要mods? – user7227230

+0

啊。它看起来像mod运营商不支持 - https://github.com/beltoforion/muparser/issues/20 这是一个耻辱。我想知道是否有一种简单的方法来为此添加/扩展? – user7227230

1

对于任何有兴趣的人。我添加了一个模运算符,加入以下内容:

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

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

是的。我运行你的代码,我的错误是未定义的符号“%”。 –

相关问题