2012-06-19 39 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