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_TemxCreate_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)的主要内容,如果未能解决你的问题,请参考以下文章

linux c++ 怎么 调用自己函数的

在 Matlab 编码器中使用可变大小的参数

如何从 Matlab 调用具有多个输出的 C++ 函数?

求用动态规划的方法求解简单的整数规划问题的matlab程序或者C++程序代码,高手们帮帮忙

强制 c++ 程序使用 dos() 将“同步”输出显示到 MATLAB 命令窗口

C++如何用new动态开辟一个一维字符数组