2012-06-19 12 views
9

Visual C++でOctaveを使用しようとしています。Octave C++とVS2010

octave-3.6.1-vs2010-setup-1.exeをダウンロードしました。新しいプロジェクトを作成し、パスを含めるためにオクタブincludeフォルダを追加し、libパスにoctinterp.libと​​を追加し、実行ディレクトリとしてOctave binフォルダを追加しました。

プログラムをコンパイルし、例外が発生feval機能を除いて正常に動作:

のMicrosoft C++の例外:

とオクターブ側の0x0012faefメモリ位置でoctave_execution_exception:

無効なサイズ変更操作、または範囲外の配列要素へのあいまいな割り当て。

私は間違っていますか? 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; 
} 

事前に感謝します。

答えて

7

feval行から発生したようです。

理由については説明がありませんが、"Debug"構成ではなく"Release"構成に切り替えるだけで問題は解決しました。

私はOctave3.6.1_vs2010ビルドを使用していますが、VS2010はWinXPで使用しています。

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

を出力して:

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

彼らのメーリングリストで尋ねられたように、Octaveは\ MDフラグ付きの実行時リンクしか許可していないようです。 – user629926

1

私は実際に次の行を指して停止し、エラーが実際にこのラインに位置していることを推測すると思います:

f_arg(0) = octave_value(NumRands); 

あなたは、ベクターから値を(?どの値)を取得しようとしているように見えますそれをベクトルとして定義されていないベクトルの要素0に割り当てます。

私は本当に知っていません...私はそのようなオクターブコードを書くことはなかった。私はちょうど標準のmatlab /オクターブコードにコードを翻訳することによってそれを解決しようとしているとその行は私には本当に奇妙なようです...

+1

私はそれはそれではないことを確認ここで

私がテストしたコードです。また、私はeval_stringが常にstd :: bad_aloc例外をスローすることを発見しました。私はhttp://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.htmlから2番目のサンプルを実行しようとしたが、それは 'argv(0)= "embedded"でスローされるので、私はしようとしました 'const std :: string a = "embedded"; argv.append(a) 'を実行し、デバッガは時々BadPtrとしていくつかの迷惑メールを表示しますが、これは非常に奇妙です。私はC + +に新しいです、多分私は何か明白な行方不明です。 – user629926

関連する問題