2012-06-19 17 views
9

Sto cercando di utilizzare Octave con Visual C++.Octave C++ e VS2010

Ho scaricato octave-3.6.1-vs2010-setup-1.exe. Creato un nuovo progetto, aggiunto la cartella include all'ottava per includere il percorso, octinterp.lib e octave.lib al percorso lib e ho aggiunto la cartella Octave bin come directory in esecuzione.

Il programma viene compilato e funziona bene, tranne feval funzione che causa l'eccezione:

Microsoft C++ eccezione: octave_execution_exception alla posizione di memoria 0x0012faef

e Octave lato:

Operazione di ridimensionamento non valida o assegnazione ambigua a un elemento di matrice fuori limite.

Cosa sto sbagliando?


codice per un 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; 
} 

Grazie in anticipo.

risposta

7

Ho provato da solo, e il problema sembra derivare dalla linea feval.

Ora non ho una spiegazione del perché, ma il problema è stato risolto semplicemente passando alla configurazione "Release" anziché alla configurazione "Debug".

Sto usando la build Octave3.6.1_vs2010, con VS2010 su WinXP.

Ecco il codice che ho provato:

#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; 
} 

con una produzione:

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

Ho chiesto sulla loro mailing list sembra che Octave consenta solo il collegamento in runtime con \ MD flag. – user629926

1

Direi che la sua in realtà fermato indicando la riga successiva e l'errore in realtà si trova in questa linea:

f_arg(0) = octave_value(NumRands); 

Sembra che tu stia cercando di ottenere un valore (quale valore?) Da un vettore e quindi assegnandolo all'elemento 0 di un vettore che non è stato definito come vettore.

Non so davvero però ... Non ho mai provato a scrivere un codice di ottava come quello. Sto solo cercando di risolvere il problema traducendo il codice in codice matlab/ottava standard e quella linea mi sembra davvero strana ...

+1

ho controllato che non è esso. Inoltre ho scoperto che eval_string genera sempre l'eccezione std :: bad_aloc. Nel caso in cui ho provato a eseguire un secondo esempio da http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html e getta a 'argv (0) = "incorporato"', quindi io provato 'const std :: string a = "embedded"; argv.append (a) 'e inoltre lancia e il debuger mostra a volte una certa quantità di spazzatura a volte come BadPtr che è tutto molto strano. Sono nuovo di C++, forse mi manca qualcosa di ovvio. – user629926