Я пишу 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, так что я подумал, что они могут быть связаны?
Но в любом случае, может быть, это не правильный путь. Как правильно выполнить весь октавный скрипт из встроенной в октаву программы на С ++? Спасибо!
Вы должны использовать функцию source_file()
скорее, чем eval_string()
, Посмотрите на parser.h
файл, который, к сожалению, не имеет много комментариев. Имена говорят сами за себя, поэтому проблем не должно быть.
Кроме того, вы в значительной степени пытаетесь переопределить Октавы source
функция. Если вы действительно хотите реализовать это снова, загляните в файл oct-parse.cc (сгенерированный в процессе сборки с помощью flex и bison).
Других решений пока нет …