2012-06-19 42 views
9

我想在Visual C++中使用Octave。Octave C++和VS2010

我已經下載了octave-3.6.1-vs2010-setup-1.exe。創建了一個新項目,加入octave include文件夾包含路徑,octinterp.lib和​​爲lib路徑,並且我添加了Octave bin文件夾作爲運行目錄。

程序編譯和運行細除了feval功能引起異常:

微軟C++異常:octave_execution_exception在存儲器位置0x0012faef

和倍頻程側:

無效的調整大小操作或模糊分配到超出範圍的數組元素。

我在做什麼錯?


代碼爲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這一行。

現在我沒有解釋爲什麼,但問題是通過簡單地切換到"Release"配置而不是"Debug"配置來解決的。

我正在使用Octave3.6.1_vs2010構建,在WinXP上使用VS2010。

這裏是我測試的代碼:

#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/octave代碼來解決這個問題,那條線對我來說似乎真的很奇怪......

+1

我檢查,這不是它。另外我發現eval_string總是拋出std :: bad_aloc異常。以防萬一我試圖從http://www.gnu.org/software/octave/doc/interpreter/Standalone-Programs.html運行第二個示例,它會拋出'argv(0)=「embedded」',所以我試過'const std :: string a =「嵌入」; argv.append(a)',它也會拋出,而debuger有時顯示爲一些垃圾,有時像BadPtr,這一切都很奇怪。我是新來的C++,也許我錯過了一些明顯的東西。 – user629926