2

我正在编写一个 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,我发现此源代码在第 00155 行会引发此确切错误,如果nargout不是 0,所以我认为它们可能相关?

但无论如何,也许这不是正确的方法。从 octave 嵌入式 c++ 程序执行整个 octave 脚本的正确方法是什么?谢谢!

4

1 回答 1

4

您应该使用该功能source_file()而不是eval_string(). 看看parser.h文件,不幸的是没有很多评论。这些名称是不言自明的,所以你不应该有很多问题。

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

于 2013-08-23T11:45:05.730 回答