在Embedded Octave C ++中如何执行脚本文件? (“错误:对脚本的无效调用”)

时间:2013-08-22 21:37:47

标签: c++ octave

我正在编写一个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 ++程序执行整个八度音阶脚本的正确方法是什么?谢谢!

1 个答案:

答案 0 :(得分:4)

您应该使用source_file()函数而不是eval_string()。查看parser.h文件,遗憾的是没有很多评论。名字是不言自明的,所以你不应该有很多问题。

此外,您正在尝试重新实现Octave的source功能。如果你真的想再次实现它,请查看oct-parse.cc文件(使用flex和bison在构建过程中生成)。