我试图使用一个简单的表达式,如下所示,结果应该是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
我正在尝试创建一个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)
可能是什么问题呢?
我试图编译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) 我需要编写一个程序,其中频繁地评估字符串表达式.表达式的示例如下:
"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) 我正在尝试使用此站点的解析器:
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不兼容吗?
我想从http://partow.net/programming/exprtk/index.html数学表达式库中编译win32 .dll或.lib .最简单的方法是什么?我正在使用MS VC++.
代码只有一个包含所有代码的.hpp.每次我编译我的程序都需要很长时间,因为它还编译exptrk.hpp文件(超过1,000kB的代码).
我有一些麻烦编译包括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) 当我在我的exprtk字符串中定义一个表达式时,比如
var x := sqrt(y);
Run Code Online (Sandbox Code Playgroud)
我尝试添加另一个变量
var X := 2*z;
Run Code Online (Sandbox Code Playgroud)
我有冲突吗?提前致谢.
我没有自己编写数学解析器,而是尝试将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库在控制台应用程序中运行良好,我认为还有另一个问题.你知道真正的问题是什么吗?
我想从 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() 可以访问类中的数据?一种可能性是将该类的指针传递给结构的构造函数。有没有更好的办法?
我想从 ExprTk 中的表达式中获取符号列表(不是我注册的符号,而是表达式中的符号。例如,当表达式为
const std::string expression_string = "abs(sin(x)^2+5*y)";
Run Code Online (Sandbox Code Playgroud)
我需要将 x 和 y 作为列表/向量或其他内容的结果。我怎样才能做到这一点?
我正在使用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) 我正在尝试为布尔表达式创建一个解析器.表达式中的符号从类似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 == 5和a.b == '5'?