在 ExprTK 表达式中指定向量文字

问题描述 投票:0回答:1

我希望能够在 ExprTK 表达式中指定向量文字作为函数参数传递,但我看不到语法是什么或是否可能。 我正在尝试使用“all_true({1,1,0,1,1})”...有人知道我是否使用了不正确的语法或者它是否像这样不可能?

示例代码如下,我尝试了3种方法:

  • “all_true(y)” => 使用变量而不是文字显然可以工作(y 是 double[5] 并通过 add_vector 注册)
  • "all_true({1,1,0,1,1})" => 这就是我想要的工作!错误:ERR238 - 应为“}”而不是:“,”
  • "var v[5]:={1,1,0,1,1};all_true(v)" => 作为一种解决方法,但不像我希望的最终用户那样简洁/直观!
#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++ exprtk
1个回答
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

© www.soinside.com 2019 - 2024. All rights reserved.