Ошибки компиляции при вызове GNU Octave из C

#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; в качестве входного параметра. Изучите основы стандартной библиотеки, это сделает вашу жизнь намного проще.