9

我正在尝试将 Octave 与 Visual C++ 一起使用。

我已经下载了octave-3.6.1-vs2010-setup-1.exe。创建了一个新项目,添加了 octaveinclude文件夹以包含路径octinterp.liboctave.liblib 路径,并将 Octavebin文件夹添加为运行目录。

该程序编译并运行良好,除了feval导致异常的函数:

Microsoft C++ 异常:内存位置 0x0012faef 处的 octave_execution_exception

在八度方面:

无效的调整大小操作或对越界数组元素的不明确分配。

我究竟做错了什么?


独立程序的代码:

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

提前致谢。

4

2 回答 2

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
于 2012-06-24T05:57:48.547 回答
1

我猜它实际上停止指向下一行,而错误实际上在于这一行:

f_arg(0) = octave_value(NumRands);

您似乎试图从向量中获取一个值(哪个值?),然后将其分配给尚未定义为向量的向量的元素 0。

不过我真的不知道......我从来没有尝试过编写这样的八度音程代码。我只是想通过将代码翻译成标准的 matlab/octave 代码来解决这个问题,那行对我来说似乎真的很奇怪......

于 2012-06-21T21:25:39.910 回答