2016-12-24 15 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 '%'記号が気に入らないようです。改造のためにいくつかの設定が必要ですか? – 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

はい。私はあなたのコードを実行し、私のエラーは未定義のシンボル "%"でした。 –

関連する問題