我正在编写一个c ++ oct文件,我想用它作为我的c ++代码和用Octave编写的脚本之间的链接。我可以毫无问题地构建和执行,只要我做简单的事情,它似乎有效。我甚至可以用feval()
调用脚本文件中的函数!我似乎无法弄清楚如何执行整个脚本文件..
如果我尝试这个简单的程序,我会收到错误,但我不确定为什么
#include <octave/oct.h>
#include <octave/octave.h>
#include <octave/parse.h>
#include <octave/toplev.h> // for do_octave_atexit
#include <iostream>
#include <string>
using namespace std;
void runscript(const string &file) {
cout << "attempting to run: " << file << endl;
int parse_status = 0;
eval_string(file, false, parse_status);
cout << "parse_status: " << parse_status << endl;
eval_string(file, false, parse_status, 0); // I'm not sure what the difference here is or
// what the value 0 means, I can't find any documentation on
// what `hargout` is.. See Note {1} below
cout << "parse_status: " << parse_status << endl;
}
int main(int argc, char **argv) {
// Set-up
char *oct_argv[3] = {(char*)"embedded", (char*)"-q", (char*)"--interactive"};
octave_main(3, oct_argv, true);
// Attempt to run script
runscript("Script1");
runscript("Script1.m");
// `a` should be defined after running Script1.m..
octave_value_list a = get_top_level_value("a", false);
do_octave_atexit ();
return 0;
}
Script1.m很简单,看起来像这样:
a = 1000;
a
当我跑步时,我总是得到这个输出:
attempting to run: Script1
error: invalid call to script /Users/Daly/Documents/School/EECS/Labs/GitHub/deep/Octave/ Script1.m
parse_status: 0
parse_status: 0
attempting to run: Script1.m
parse_status: 0
parse_status: 0
error: get_top_level_value: undefined symbol 'a'
无论我尝试使用eval_string多少次或按什么顺序,它都是第一次抱怨无效呼叫。
注意:{1}搜索error: invalid call to script
后,我发现this source code如果nargout
不为0,则会在00155行引发此确切错误,因此我认为它们可能相关?
但无论如何,也许这不是正确的方法。从八度嵌入式c ++程序执行整个八度音阶脚本的正确方法是什么?谢谢!
答案 0 :(得分:4)
您应该使用source_file()
函数而不是eval_string()
。查看parser.h
文件,遗憾的是没有很多评论。名字是不言自明的,所以你不应该有很多问题。
此外,您正在尝试重新实现Octave的source
功能。如果你真的想再次实现它,请查看oct-parse.cc文件(使用flex和bison在构建过程中生成)。