#c #c 11 #gcc #octave
#c #c 11 #gcc #octave
Вопрос:
Я пытаюсь написать функцию, которая встраивает интерпретатор Octave в C , как описано здесь https://octave.org/doc/v4.0.1/Standalone-Programs.html .
Я пытаюсь сделать это из программы, которую я пишу в Eclipse, и пытаюсь скомпилировать с помощью GCC в Linux. Я хочу иметь возможность вызывать внешний скрипт, как во втором примере по ссылке.
Мой код пока выглядит так…..
#include <iostream>
#include <oct.h>
#include <octave.h>
#include <parse.h>
#include <interpreter.h>
using namespace std;
class OctaveInt {
public:
void callOctave (double, int, string);
OctaveInt(string path );
private:
octave::interpreter interpreter;
};
// Member functions including constructor..
OctaveInt::OctaveInt(string path)
{
// Constructor - initialises engine and sets path
int status = interpreter.execute();
octave_value_list p;
p(0) = path;
octave_value_list o1 = octave::feval ("addpath", p);
}
void OctaveInt::callOctave(double params, int size, string name) {
std::cout << "Hello World" << std::endl;
int n = 2;
octave_value_list in;
octave_value_list p;
for (octave_idx_type i=0; i < size; i )
in(i) = octave_value(params[i]);
octave_value_list out = octave::feval (name, in);
std::cout << "Output is ";
std::cout << out(0).int_value();
}
int main() {
double params[] = {100, 2, 3, 4, 5, 6};
int size = 6;
string path = "/home/arwel/eclipseWorkspace_new/octaveCaller/src/";
OctaveInt octI(path);
octI.callOctave(params, size, "myFunction");
return 0;
}
Однако, когда я пытаюсь скомпилировать, я получаю ряд ошибок…..
Invoking: GCC C Compiler
g -std=c 0x -I/usr/include/octave-5.2.0/octave/ -I/usr/share/octave/5.2.0/etc/tests -I/usr/lib/x86_64-redhat-linux6E -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"src/octaveCaller.d" -MT"src/octaveCaller.o" -o "src/octaveCaller.o" "../src/octaveCaller.cpp"
../src/octaveCaller.cpp: In constructor ‘OctaveInt::OctaveInt(std::string)’:
../src/octaveCaller.cpp:31:6: warning: unused variable ‘status’ [-Wunused-variable]
int status = interpreter.execute();
^
../src/octaveCaller.cpp: In member function ‘void OctaveInt::callOctave(double, int, std::string)’:
../src/octaveCaller.cpp:48:32: error: invalid types ‘double[octave_idx_type {aka long int}]’ for array subscript
in(i) = octave_value(params[i]);
^
../src/octaveCaller.cpp:42:6: warning: unused variable ‘n’ [-Wunused-variable]
int n = 2;
^
../src/octaveCaller.cpp: In function ‘int main()’:
../src/octaveCaller.cpp:65:44: error: no matching function for call to ‘OctaveInt::callOctave(double [6], intamp;, const char [11])’
octI.callOctave(params, size, "myFunction");
^
../src/octaveCaller.cpp:65:44: note: candidate is:
../src/octaveCaller.cpp:38:6: note: void OctaveInt::callOctave(double, int, std::string)
void OctaveInt::callOctave(double params, int size, string name) {
^
../src/octaveCaller.cpp:38:6: note: no known conversion for argument 1 from ‘double [6]’ to ‘double’
make: *** [src/octaveCaller.o] Error 1
"make all" terminated with exit code 2. Build might be incomplete.
12:41:36 Build Failed. 3 errors, 2 warnings. (took 1s.927ms)
Похоже, у меня некоторые проблемы с типами переменных (??).
Я не очень хорошо знаю C , поэтому я, несомненно, делаю какую-то базовую ошибку C . Может кто-нибудь помочь мне выяснить, что я делаю не так?
Комментарии:
1. В
callOctave()
, вы объявляетеparam
как double , но затем пытаетесь индексировать в него. Вы можете индексировать только в массив. Вы также пытаетесь передать массив в эту функцию, которая ожидает double . Вероятно, вы хотите объявить входной параметр какdouble params[]
. Но еще лучше использоватьstd::vector constamp;
в качестве входного параметра. Изучите основы стандартной библиотеки, это сделает вашу жизнь намного проще.