我希望能够在 ExprTK 表达式中指定向量文字作为函数参数传递,但我看不到语法是什么或是否可能。 我正在尝试使用“all_true({1,1,0,1,1})”...有人知道我是否使用了不正确的语法或者它是否像这样不可能?
示例代码如下,我尝试了3种方法:
#include "exprtk.hpp"
#include <stdio.h>
int main(void) {
typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double> expression_t;
typedef exprtk::parser<double> parser_t;
typedef exprtk::parser_error::type err_t;
double y[] = { 1, 1, 0, 1, 1 };
exprtk::rtl::vecops::package<double> vecops_package;
symbol_table_t symbol_table;
symbol_table.add_vector("y",y);
symbol_table.add_package(vecops_package);
expression_t expression;
expression.register_symbol_table(symbol_table);
parser_t parser;
// all_true(y)
if (parser.compile("all_true(y)",expression)) {
printf("%.1f\n",expression.value());
}
else {
printf("Error: %s\n", parser.error().c_str());
}
// all_true({1,1,0,1,1})
if (parser.compile("all_true({1,1,0,1,1})",expression)) {
printf("%.1f\n",expression.value());
}
else {
printf("Error: %s\n", parser.error().c_str());
}
// var v[5]:={1,1,0,1,1};all_true(v)
if (parser.compile("var v[5]:={1,1,0,1,1};all_true(v)",expression)) {
printf("%.1f\n",expression.value());
}
else {
printf("Error: %s\n", parser.error().c_str());
}
return 0;
}
正如您所指出的,前两个示例有效。然而,大括号语法“{}”本质上等同于 C++ 中的初始化列表。简而言之,它与向量的类型不同,并且仅应该在初始化向量时使用。
如果向量的值在编译时都是已知的,就像第三个示例中的情况,那么也许可以将这些值简单地传递给
all_true
自由函数,如下所示:
all_true(1,1,0,1,1)
以下采用向量的函数具有类似的输入样式:
all_false
、all_true
、any_true
、any_false
、count
、sum
、min
、max
、avg
btw 看起来 Parrot 正在做类似的事情:https://developer.parrot.com/docs/sphinx/sensors_alteration_syntax.html