【问题标题】:Octave c++ and VS2010八度 C++ 和 VS2010
【发布时间】:2012-06-21 10:45:30
【问题描述】:

我正在尝试在 Visual C++ 中使用 Octave。

我已经下载了octave-3.6.1-vs2010-setup-1.exe。创建了一个新项目,将 octave include 文件夹添加到包含路径,octinterp.liboctave.lib 到 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;
}

提前致谢。

【问题讨论】:

    标签: c++ matlab visual-c++ octave


    【解决方案1】:

    我自己试了一下,问题好像出在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
    

    【讨论】:

    • 我在他们的邮件列表中询问过,Octave 似乎只允许运行时链接与 \MD 标志。
    【解决方案2】:

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

    f_arg(0) = octave_value(NumRands);
    

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

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

    【讨论】:

    • 我检查过不是它。我还发现 eval_string 总是抛出 std::bad_aloc 异常。以防万一我试图从gnu.org/software/octave/doc/interpreter/… 运行第二个样本并且它抛出 'argv(0) = "embedded" ',所以我尝试了 'const std::string a="embedded"; argv.append(a)' 并且它也会抛出,调试器有时会显示一些垃圾,有时会显示为 BadPtr,这一切都很奇怪。我是 C++ 新手,也许我遗漏了一些明显的东西。
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 2014-07-16
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多