标签: exprtk

ExprTk中的简单数学表达式

我试图使用一个简单的表达式,如下所示,结果应该是z的值变为1.但是,似乎没有任何关于如何解决这个问题的建议?

template<typename t>
void MyTestB()
{

    t x = 1.0;
    t z = 0;

    std::string e = "if((x + 2) == 3){z=1;}";
    exprtk::symbol_table<t> symbol_table;
    symbol_table.add_variable("x",x);
    symbol_table.add_variable("z",z);

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


    exprtk::parser<t> parser;

    parser.compile(e,expression);
    t y = expression.value();
    std::cout << z;
}
Run Code Online (Sandbox Code Playgroud)

程序确实在y = NAN完成(这是可以理解的,因为表达式是条件语句)但是z仍然是0.我期待它变为1

c++ exprtk

15
推荐指数
1
解决办法
1897
查看次数

在Qt中评估数学表达式

我正在尝试创建一个Qt应用程序,我需要一个数学表达式评估器来评估这样的事情,例如(4 + 5)*2-9/3.我将此库的.hpp文件(http://www.partow.net/programming/exprtk/)包含在Qt Creator中的项目中,并尝试启动以下代码示例:

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

int main()
{
   typedef exprtk::expression<double> expression_t;
   typedef exprtk::parser<double>         parser_t;

   std::string expression_string = "3 + sqrt(5) + pow(3,2) + log(5)";

   expression_t expression;

   parser_t parser;

   if (parser.compile(expression_string,expression))
   {
     double result = expression.value();

     printf("Result: %19.15\n",result);
   }
   else
     printf("Error in expression\n.");

   return 0;
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译并运行它时,我得到以下输出:

 debug\main.o:-1: error: too many sections (62303)
Run Code Online (Sandbox Code Playgroud)

可能是什么问题呢?

c++ qt exprtk

15
推荐指数
1
解决办法
4512
查看次数

ExprTk具有更高的精度

我试图编译ExprTk库的精度比long double.我认为简化会尝试GCC,__float128但我得到以下编译错误,我不知道如何纠正它.

exprtk.hpp: In instantiation of ‘static T exprtk::details::and_op<T>::process(exprtk::details::and_op<T>::Type, exprtk::details::and_op<T>::Type) [with T = __float128; exprtk::details::and_op<T>::Type = const __float128&]’:
exprtk.hpp:28439:10:   required from ‘void exprtk::parser<T>::load_binary_operations_map(exprtk::parser<T>::binary_op_map_t&) [with T = __float128; exprtk::parser<T>::binary_op_map_t = std::map<exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&), std::less<exprtk::details::operator_type>, std::allocator<std::pair<const exprtk::details::operator_type, __float128 (*)(const __float128&, const __float128&)> > >; typename exprtk::details::functor_t<T>::bfunc_t = __float128 (*)(const __float128&, const __float128&)]’
exprtk.hpp:15660:51:   required from ‘exprtk::parser<T>::parser(std::size_t) [with T = __float128; std::size_t = long unsigned int]’
mathtof.cpp:18:33:   required from here
exprtk.hpp:9923:105: error: call of overloaded ‘is_true(const …
Run Code Online (Sandbox Code Playgroud)

c++ templates c++11 exprtk

13
推荐指数
1
解决办法
373
查看次数

在多线程程序中使用exprtk

我需要编写一个程序,其中频繁地评估字符串表达式.表达式的示例如下:

"x0*a0*a0+x1*a1+x2*a2+x3*a3+x4*a4....."
Run Code Online (Sandbox Code Playgroud)

表达式可以很长,字符串可以包含多个这样的表达式.

我使用C++库exprtk编写了一些测试代码.

vector<std::string> observation_functions;
vector<std::string> string_indices;


template<typename T>
float* get_observation(float* sing_j, float* zrlist, int num_functions,int num_variables)
{
    //omp_set_nested(1);

    float* results = (float*)malloc(sizeof(float)*num_functions);
    exprtk::symbol_table<float> symbol_table;

    exprtk::expression<T> expression;
    exprtk::parser<T> parser;
    int i;
    for( i = 0; i < num_variables; i++)
    {
            symbol_table.add_variable("x"+string_indices[i], sing_j[i]);
            symbol_table.add_variable("a"+string_indices[i], zrlist[i]);
    }

    expression.register_symbol_table(symbol_table);
    for(i = 0; i < num_functions; i++)
    {
            parser.compile(observation_functions[i],expression);
            results[i] = expression.value();
    }
    return results;
}



int main()
{

    for( int i = 0; i < 52; i++)
    {

    ostringstream s2;
    s2<<i;
    string_indices.push_back(s2.str()); …
Run Code Online (Sandbox Code Playgroud)

c++ performance multithreading openmp exprtk

11
推荐指数
2
解决办法
1065
查看次数

Exprtk解析器无法在VS 2015上运行?

我正在尝试使用此站点的解析器:

http://www.partow.net/programming/exprtk/

在VS 2015上.不幸的是,我在编译exprtk_simple_example_01时遇到以下错误(使用解析器下载中包含的示例文件之一):

Severity    Code    Description Project File    Line    Suppression State
Error   C4996   'std::_Copy_impl': Function call with parameters that may be       
unsafe - this call relies on the caller to check that the passed values are 
correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See 
documentation on how to use Visual C++ 'Checked Iterators'  TEST        
c:\program files (x86)\microsoft visual studio 14.0\vc\include\xutility 2229    
Run Code Online (Sandbox Code Playgroud)

这是为什么?这个解析器与VS 2015不兼容吗?

c++ parsing exprtk

10
推荐指数
1
解决办法
353
查看次数

从exprtk编译win32库

我想从http://partow.net/programming/exprtk/index.html数学表达式库中编译win32 .dll或.lib .最简单的方法是什么?我正在使用MS VC++.

代码只有一个包含所有代码的.hpp.每次我编译我的程序都需要很长时间,因为它还编译exptrk.hpp文件(超过1,000kB的代码).

c++ math dll exprtk

9
推荐指数
1
解决办法
316
查看次数

编译包含exprTk的c ++文件时遇到麻烦

我有一些麻烦编译包括exprtk在内的c ++代码.我想编译一个给定的包示例(我称之为parser.cpp):

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


template <typename T>
void trig_function()
{
   typedef exprtk::symbol_table<T> symbol_table_t;
   typedef exprtk::expression<T>     expression_t;
   typedef exprtk::parser<T>             parser_t;

   std::string expression_string = "clamp(-1.0,sin(2 * pi * x) + cos(x / 2 * pi),+1.0)";

   T x;

   symbol_table_t symbol_table;
   symbol_table.add_variable("x",x);
   symbol_table.add_constants();

   expression_t expression;
   expression.register_symbol_table(symbol_table);

   parser_t parser;
   parser.compile(expression_string,expression);

   for (x = T(-5); x <= T(+5); x += T(0.001))
   {
      T y = expression.value();
      printf("%19.15f\t%19.15f\n",x,y);
   }
}

int main()
{
    trig_function<double>();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

因此我在cmd中使用以下命令:

g++ -c -o …
Run Code Online (Sandbox Code Playgroud)

c++ g++ string-parsing exprtk

8
推荐指数
1
解决办法
665
查看次数

exprtk中的变量是否区分大小写?

当我在我的exprtk字符串中定义一个表达式时,比如

var x := sqrt(y);
Run Code Online (Sandbox Code Playgroud)

我尝试添加另一个变量

var X := 2*z;
Run Code Online (Sandbox Code Playgroud)

我有冲突吗?提前致谢.

c++ exprtk

8
推荐指数
2
解决办法
228
查看次数

包括数学解析器"exprtk"的问题

我没有自己编写数学解析器,而是尝试将exprtk(exprtk)实现到我的项目中.如果我在控制台项目中实现它,它工作正常.但是,它在我的CLR项目中失败了.错误显示"Debug Assertion Failed [...] Expression:_CrtlsValidHeapPointer(block)[...]".只有在我写行时才会出现错误

parser<double> parser;
Run Code Online (Sandbox Code Playgroud)

要么

symbol_table<double> symbolTable;
symbolTable.add_constants();
Run Code Online (Sandbox Code Playgroud)

一些互联网站点说_CrtlsValidHeapPointer表达式错误显示内存地址不在堆中.但是由于exprtk.hpp库在控制台应用程序中运行良好,我认为还有另一个问题.你知道真正的问题是什么吗?

math parsing exprtk

6
推荐指数
0
解决办法
186
查看次数

C++ exrtk - 可以在类中使用吗?

我想从 exprtk 调用一个类的函数。( http://www.partow.net/programming/exprtk/ )

我想用symbol_table.add_function 用这个工具包注册一个函数。因此,需要从该工具包提供的 ifunction 派生我的类:

 template <typename T>
   struct foo : public exprtk::ifunction<T>
   {
      foo() : exprtk::ifunction<T>(0)
      {}

      T operator()()
      {
         // here I want to access data from a class which owns this struct
      }
   };
Run Code Online (Sandbox Code Playgroud)

是否有可能以某种方式包含这个结构,一个类可以访问它,并且这个结构的 operator() 可以访问类中的数据?一种可能性是将该类的指针传递给结构的构造函数。有没有更好的办法?

c++ nested class exprtk

5
推荐指数
1
解决办法
283
查看次数

ExprTk,获取表达式中的符号/变量列表

我想从 ExprTk 中的表达式中获取符号列表(不是我注册的符号,而是表达式中的符号。例如,当表达式为

const std::string expression_string = "abs(sin(x)^2+5*y)";
Run Code Online (Sandbox Code Playgroud)

我需要将 x 和 y 作为列表/向量或其他内容的结果。我怎样才能做到这一点?

c++ exprtk

4
推荐指数
1
解决办法
724
查看次数

ExprTk:表达式的值在更改时是否必须重新编译

我正在使用exprtk创建一个表达式,使用不断变化的变量.

每次更改变量的值时,是否必须重置并重新编译exprtk::expression使用更新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 …
Run Code Online (Sandbox Code Playgroud)

c++ exprtk

3
推荐指数
1
解决办法
367
查看次数

ExprTK未知的变量分辨率取决于表达式类型

我正在尝试为布尔表达式创建一个解析器.表达式中的符号从类似XML的数据结构中读取.

为类似的东西实现解析器很简单

a.b == 'some value'
Run Code Online (Sandbox Code Playgroud)

通过使用"未知符号解析器"使用ExprTK,它通过返回字符串值将ab解析为字符串<a><b>some value</b></a>.

但现在考虑XML <a><b>5</b></a>

有没有什么办法来写一个未知符号解析它允许同时评估a.b == 5a.b == '5'

c++ exprtk

3
推荐指数
1
解决办法
286
查看次数

标签 统计

exprtk ×13

c++ ×12

math ×2

parsing ×2

c++11 ×1

class ×1

dll ×1

g++ ×1

multithreading ×1

nested ×1

openmp ×1

performance ×1

qt ×1

string-parsing ×1

templates ×1