Matlab C++ - 接收动态大小输出类型 (emxArray_real_T)
Posted
技术标签:
【中文标题】Matlab C++ - 接收动态大小输出类型 (emxArray_real_T)【英文标题】:Matlab C++ - Receive Dynamic Size Output type (emxArray_real_T) 【发布时间】:2014-07-09 20:08:58 【问题描述】:我已经使用 coder 将一些 matlab 代码转换为 C++。
void myfunction(const emxArray_real_T *input, emxArray_real_T *output) ...
我已经设置好发送emxArray_real_T
类型的输入,没有任何问题。如何设置在调用myfunction
的 C++ 中接收动态大小的输出?
代码更新:
main()
.
.
.
double *inputVec;
inputVec=(double*)malloc(1000 * sizeof(double));
emxArray_real_T *input;
emxArray_real_T *output;
input=emxCreateWrapper_real_T(&inputVec[0],1,1000);
output = emxCreateWrapper_real_T(NULL,0,0);
myfunction(input,output);
emxDestroyArray_real_T(input);
emxDestroyArray_real_T(output);
.
.
这编译得很好但错误说
*** glibc detected *** /data/myscript : double free or corruption (!prev): 0x000000000de54920 ***
【问题讨论】:
【参考方案1】:您可以查看https://***.com/a/24271438/3297440,它似乎涵盖了类似的问题。
在这种特殊情况下,问题很可能是output
指向的内存从未初始化。您可以使用myfunction_emxAPI.h
中的emxCreate*
函数之一来初始化一个空的emxArray
并将其传入。emxCreateWrapper_real_T
和emxCreate_real_T
之间的选择取决于您是否想要拥有分配给数据。前者将所有权交给你,后者在emxArray
拥有内存时使用。
类似:
output = emxCreateWrapper_real_T(NULL,0,0);
在调用myfunction
之前应该可以解决问题。
对了,别忘了打电话:
emxDestroyArray_real_T(input);
emxDestroyArray_real_T(output);
最后清理emxArrays
内分配的所有内存。即使使用了包装函数,也可以为大小向量分配存储空间。
【讨论】:
我已经更新了你提到的代码。我仍然有同样的问题double free or corruption
。还有什么我可以检查的吗?
很好奇,我刚刚测试了一些看起来与您的代码大致相同的代码,其中myfunction
只是将输入乘以 2。崩溃是否确定了 double free 的位置?您能否尝试构建代码调试并在调试器中运行以查明位置?一定有什么东西以无效的方式释放内存需要查明。
还有一件事要检查。 myfunction.h
中有函数myfunction_initialize/terminate
吗?如果是这样,它们应该在调用myfunction
之前/之后分别调用一次。这些将用于初始化任何必要的持久数据。以上是关于Matlab C++ - 接收动态大小输出类型 (emxArray_real_T)的主要内容,如果未能解决你的问题,请参考以下文章
求用动态规划的方法求解简单的整数规划问题的matlab程序或者C++程序代码,高手们帮帮忙