将C++ argv[] 解释为变量与 CERN 根之间的关系

Interpret C++ argv[] as relationship between variables with CERN's ROOT

本文关键字:CERN 之间 关系 变量 argv C++ 解释      更新时间:2023-10-16

我希望能够调用命令行中变量或变量组合的函数,例如:

$ ./myFunction.exe "var1"

$ ./myFunction.exe "var1/var2"

稍后,在脚本中,我定义了一个变量 float var ,该>应根据用户输入来定义。对于第一种情况,我想要:

float VAR = var1;

...对于第二种情况,我想要:

float VAR = var1/var2;

Cern的根框架中是否有一种方法可以将此用户定义的字符数组解释为此类变量名称之间的关系?我意识到这是一个伸展,但是现在每次我想更改VAR时,我都需要对此进行精心编码,我宁愿不必这样做。

请注意,这些变量是在我从外部 *.root文件中读取的ttree中命名的,因此我认为使用groot-> ProcessLine()()可能有一种方法来定义 var ,但我无法弄清楚。我知道这在直c 中是不可能的,但是我觉得有根。

您是否在根5或6上?对我来说,这在root 5.34:

上起作用

test.cpp

double x = 2;
double y = 3;
double z;
void test(const char* arg)
{
  gROOT->ProcessLine(TString("z=")+arg);
  cout << z << endl;
}

在根外壳中:

.x test.cpp("x/y")

输出:

0.666667

不起作用的是xy作为test()中的本地变量,这将导致

Error: Symbol x is not defined in current scope
Error: Symbol y is not defined in current scope

在本示例中也创建了变量z,因此ProcessLine函数似乎在全局范围中运行,而不是在调用函数的范围中运行。

我假设您只想将算术表达式传递到例程中。如果是这样,这是使用root's tformula的替代解决方案(在root6中):

#include <iostream>
#include "TFormula.h"
#include "TString.h"
int main(int argc, char **argv)
{
   TFormula my_formula("my_formula", TString(argv[argc-1]) );
   my_formula.SetParNames("var1", "var2");
   my_formula.SetParameter("var1", 3.45678);
   my_formula.SetParameter("var2", 8.76543);
   // The formula does not define any variable so input to TFormula::Eval() is
   // irrelevant
   double dummy = 0;
   std::cout << "my_formula: " << my_formula.GetExpFormula("clingp") << "n"
             << "result:     " << my_formula.Eval(dummy) << std::endl;
   return EXIT_SUCCESS;
}

注意事项是您需要将变量包裹在方括号中[]中:

$ ./myFunction.exe "[var1]/[var2]"
$ ./myFunction.exe "[var1]"
$ ./myFunction.exe "[var1]/[var2]+[var1]*[var2]"

这是tformula参数的符号。