2017-04-09 10 views
3

常に変化する変数を使用してexprtkの式を作成しています。ExprTk:値が変更されたときに式を再コンパイルする必要があります

をリセットして、再コンパイルする必要がありますか?変数の値を変更するたびに、exprtk::symbol_tableが更新されますか?

更新された値は、既存のコンパイル済み式によって直接評価されますか?

#include <iostream> 
#include <string> 
#include "exprtk.hpp" 

int main() { 
    std::string expression_string = "y := x + 1"; 

    int x = 1; 

    exprtk::symbol_table<int> symbol_table; 
    symbol_table.add_variable("x", x); 

    exprtk::expression<int> expression; 
    expression.register_symbol_table(symbol_table); 

    exprtk::parser<int> parser; 

    if (!parser.compile(expression_string, expression)) 
    { 
     std::cout << "Compilation error." << std::endl; 
     return 1; 
    } 

    expression.value(); // 1 + 1 

    x = 2; 
    // Do I have to create a new symbol_table, expression and parse again? 

    // Or does the expression evaluate the new value directly? 
    expression.value(); // 2 + 1? 

    return 0; 
} 

答えて

6

exprtk::expressionないは、変数の値がexprtk::symbol_table変更によって参照されたときに再コンパイルする必要もありません。 expression.value()はすぐに使用できます。

According to the documentation(セクション10 - コンポーネント)では、シンボルテーブルで参照される変数の実際の値は、式が評価されるまで解決されません。したがって、パーサで同じ式をコンパイルすることは、一度だけ発生する必要があります。コンパイルプロセス中に

std::string expression_string = "x * y + 3"; 
symbol_table.add_variable("x",x); 
symbol_table.add_variable("y",y); 

expression.register_symbol_table(symbol_table); 

parser.compile(expression_string,expression); 

x = 1.0; 
y = 2.0; 
expression.value(); // 1 * 2 + 3 

x = 3.7; 
expression.value(); // 3.7 * 2 + 3 

y = -9.0; 
expression.value(); // 3.7 * -9 + 3 

// 'x * -9 + 3' for x in range of [0,100) in steps of 0.0001 
for (x = 0.0; x < 100.0; x += 0.0001) 
{ 
    expression.value(); // x * -9 + 3 
} 

[..]要素は、式のAST内に埋め込まれます。 元の要素を の式インスタンス[...]から独立して変更することができます。 が通常はプログラム内にあるように変数が変更され、式が評価されるときに変数に割り当てられた現在の値がになります。中古。

関連する問題