2012-06-19 16 views
9

Estoy tratando de usar Octave con Visual C++.Octave C++ y VS2010

He descargado octave-3.6.1-vs2010-setup-1.exe. Se creó un nuevo proyecto, se agregó la carpeta octava include para incluir la ruta, octinterp.lib y octave.lib en la ruta de la lib, y agregué la carpeta Octave bin como directorio de ejecución.

El programa compila y ejecuta bien, excepto feval función que hace que la excepción:

Microsoft C++ excepción: octave_execution_exception en la posición de memoria 0x0012faef

y en el lado de octava:

La operación de cambio de tamaño no es válida o la asignación ambigua a un elemento de matriz fuera de límites.

¿Qué estoy haciendo mal?

Código

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

Gracias de antemano.

Respuesta

7

Lo intenté yo mismo, y el problema parece provenir de la línea feval.

Ahora no tengo una explicación de por qué, pero el problema se resolvió simplemente cambiando a la configuración "Release" en lugar de la configuración "Debug".

Estoy usando la compilación Octave3.6.1_vs2010, con VS2010 en WinXP.

Este es el código que probé:

#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 producción:

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

Le pregunté en su lista de correo que parece que Octave solo permite el enlace en tiempo de ejecución con \ MD flag. – user629926

1

supongo que su realidad se detuvo apuntando a la siguiente línea y el error de hecho se encuentra en esta línea:

f_arg(0) = octave_value(NumRands); 

Usted parece estar tratando de obtener un valor (que de valor?) De un vector y luego asignarlo al elemento 0 de un vector que no ha sido definido como un vector.

No lo sé realmente ... Nunca intenté escribir un código de octava como ese. Estoy tratando de resolverlo traduciendo el código al código estándar de matlab/octava y esa línea me parece realmente extraña ...

+1

que comprueba que no es ella. También encontré que eval_string siempre arroja la excepción std :: bad_aloc. Solo en caso de que trate de ejecutar una segunda muestra desde http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html y arroja en 'argv (0) = "embedded"', entonces intenté 'const std :: string a = "embedded"; argv.append (a) 'y también arroja y el debuger muestra a veces como basura a veces como BadPtr, lo cual es muy extraño. Soy nuevo en C++, tal vez me falta algo obvio. – user629926