2012-06-19 17 views
9

Ich versuche Octave mit Visual C++ zu verwenden.Octave C++ und VS2010

Ich habe octave-3.6.1-vs2010-setup-1.exe heruntergeladen. Ein neues Projekt erstellt, Oktav include Ordner hinzugefügt, Pfad, octinterp.lib und octave.lib zu lib Pfad hinzuzufügen, und ich habe Octave bin Ordner als laufendes Verzeichnis hinzugefügt.

Das Programm kompiliert und läuft gut, außer feval Funktion, die die Ausnahme verursacht:

Microsoft C++ Ausnahme: octave_execution_exception an der Speicherstelle 0x0012faef

und auf Seite Octave:

Ungültige Größenänderung oder mehrdeutige Zuweisung zu einem Arrayelement außerhalb der Grenzen.

Was mache ich falsch?


-Code für ein 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; 
} 

Vielen Dank im Voraus.

Antwort

7

Ich habe es selbst versucht, und das Problem scheint von der feval Linie zu stammen.

Jetzt habe ich keine Erklärung, warum, aber das Problem wurde durch einfaches Umschalten auf die "Release" Konfiguration anstelle der "Debug" Konfiguration gelöst.

Ich verwende die Octave3.6.1_vs2010 Build, mit VS2010 auf WinXP. Hier

ist der Code, den ich getestet:

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

mit einem Ausgang:

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

Ich fragte auf ihrer Mailing-Liste, es scheint, dass Oktave nur erlaubt Laufzeitlink mit \ MD Flag. – user629926

1

Ich würde vermuten, dass seine tatsächlich zeigt auf der nächsten Zeile gestoppt und der Fehler liegt tatsächlich in dieser Zeile:

f_arg(0) = octave_value(NumRands); 

Sie scheinen einen Wert (der Wert?) Bekommen zu versuchen, von einem Vektor und dann es dem Element 0 eines Vektors zuweisen, der nicht als Vektor definiert wurde.

Ich weiß es nicht wirklich ... Ich habe nie versucht, Oktavcode so zu schreiben. Ich versuche nur, es auszuarbeiten, indem ich den Code in Standard-Matlab/Oktave-Code übersetze und diese Zeile scheint mir wirklich komisch ...

+1

Ich habe, dass es es nicht. Auch ich fand, dass eval_string immer std :: bad_aloc Ausnahme wirft. Nur für den Fall, dass ich versucht habe, ein zweites Beispiel von http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html zu starten, und es wirft 'argv (0) = "embedded"', also ich versuchte 'const std :: string a = "embedded"; argv.append (a) 'und es wirft auch und der Debuger zeigen manchmal als Junk manchmal als BadPtr was alles sehr seltsam ist. Ich bin neu in C++, vielleicht vermisse ich etwas Offensichtliches. – user629926