В Embedded Octave C ++, как мне выполнить файл скрипта? (& quot; ошибка: неверный вызов скрипта & quot;)

Я пишу oct-файл c ++, который я хотел бы использовать в качестве ссылки между моим кодом 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, так что я подумал, что они могут быть связаны?

Но в любом случае, может быть, это не правильный путь. Как правильно выполнить весь октавный скрипт из встроенной в октаву программы на С ++? Спасибо!

2

Решение

Вы должны использовать функцию source_file() скорее, чем eval_string(), Посмотрите на parser.h файл, который, к сожалению, не имеет много комментариев. Имена говорят сами за себя, поэтому проблем не должно быть.

Кроме того, вы в значительной степени пытаетесь переопределить Октавы source функция. Если вы действительно хотите реализовать это снова, загляните в файл oct-parse.cc (сгенерированный в процессе сборки с помощью flex и bison).

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]