2012-06-19 18 views
9

Próbuję użyć Octave z Visual C++.Oktawa C++ i VS2010

Pobrałem octave-3.6.1-vs2010-setup-1.exe. Utworzono nowy projekt, dodano folder oktawy include, aby dołączyć ścieżkę, octinterp.lib i octave.lib do ścieżki biblioteki, a jako katalog bieżący dodano folder Octave bin.

Program kompiluje i działa poprawnie z wyjątkiem feval funkcji, która powoduje wyjątek:

Microsoft C++ wyjątek: octave_execution_exception w miejscu pamięci 0x0012faef

i na stronie Octave:

Nieprawidłowa operacja zmiany rozmiaru lub niejednoznaczne przypisanie do elementu tablicy poza obszarem.

Co robię źle?


Kod dla standalone program:

#include <octave/octave.h> 
#include <octave/oct.h> 
#include <octave/parse.h> 

int main(int argc, char **argv) 
{ 
    if (octave_main (argc, argv, true)) 
    { 
     ColumnVector NumRands(2); 
     NumRands(0) = 10; 
     NumRands(1) = 1; 
     octave_value_list f_arg, f_ret; 
     f_arg(0) = octave_value(NumRands); 
     f_ret = feval("rand",f_arg,1); 
     Matrix unis(f_ret(0).matrix_value()); 
    } 
    else 
    { 
     error ("Octave interpreter initialization failed"); 
    } 
    return 0; 
} 

góry dzięki.

Odpowiedz

7

Próbowałem tego sam, a problem wydaje się pochodzić z linii feval.

Teraz nie mam wyjaśnienia, dlaczego, ale problem został rozwiązany po prostu przełączeniu na konfigurację "Release" zamiast konfiguracji "Debug".

Używam kompilacji Octave3.6.1_vs2010, z VS2010 na WinXP.

Oto kod I przetestowane:

#include <iostream> 
#include <octave/oct.h> 
#include <octave/octave.h> 
#include <octave/parse.h> 

int main(int argc, char **argv) 
{ 
    // Init Octave interpreter 
    if (!octave_main(argc, argv, true)) { 
     error("Octave interpreter initialization failed"); 
    } 

    // x = rand(10,1) 
    ColumnVector sz(2); 
    sz(0) = 10; sz(1) = 1; 
    octave_value_list in = octave_value(sz); 
    octave_value_list out = feval("rand", in, 1); 

    // print random numbers 
    if (!error_state && out.length() > 0) { 
     Matrix x(out(0).matrix_value()); 
     std::cout << "x = \n" << x << std::endl; 
    } 

    return 0; 
} 

o mocy:

x = 
0.165897 
0.0239711 
0.957456 
0.830028 
0.859441 
0.513797 
0.870601 
0.0643697 
0.0605021 
0.153486 
+1

Zapytałem na ich listę mailingową, wydaje się, że Octave zezwala tylko na łączenie w czasie wykonywania z flagą \ MD. – user629926

1

Przypuszczam, że jego faktycznie zatrzymał się, wskazując na następnej linii i błąd rzeczywiście leży na tej linii:

f_arg(0) = octave_value(NumRands); 

Wydaje się, że próbuje uzyskać wartość (która wartość?) Z wektorem a następnie przypisanie jej do elementu 0 wektora, który nie został zdefiniowany jako wektor.

Tak naprawdę nie wiem ... Nigdy nie próbowałem pisać o tym kodzie oktawowym. Próbuję to przetłumaczyć, tłumacząc kod na standardowy kod matlab/oktawy i ta linia wydaje mi się naprawdę dziwna ...

+1

Sprawdziłem, że nie o to chodzi. Zauważyłem również, że eval_string zawsze wyrzuca wyjątek std :: bad_aloc. Na wszelki wypadek próbowałem uruchomić drugą próbkę z http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html i wyświetla ona "argv (0) =" osadzony ", więc próbował 'const std :: string a = "embedded"; argv.append (a) ', a także wyrzuca, a debuger pokazuje czasami, jak niektóre śmieci, czasami jako BadPtr, co jest bardzo dziwne. Jestem nowy w C++, może brakuje mi czegoś oczywistego. – user629926

Powiązane problemy