Linux(GLNXA64)使用mxCreateUninitNumericMatrix R2013b

在一个MEX文件中,我用命令创build了一个输出matrix(工作正常):

plhs[0] = mxCreateNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL); 

为了加速,我想使用未初始化的dynamic内存,这导致我没有logging的命令:

 plhs[0] = mxCreateUninitNumericMatrix((mwSize)destLen, 1, mxUINT8_CLASS, mxREAL); 

在Win32和Win64中工作也很好。

在我的Linux环境中使用完全相同的代码会导致编译器的以下警告:

 warning: assignment makes pointer from integer without a cast [enabled by default] 

代码崩溃,显示返回的整数值不是指向正确内存地址的那个值。

我能做些什么来使用mxCreateUninitNumericMatrix

Solutions Collecting From Web of "Linux(GLNXA64)使用mxCreateUninitNumericMatrix R2013b"

未记录的MEX函数在mex.h头文件中没有相应的原型,所以你必须自己写一个。 在这种情况下,它将是:

 EXTERN_C mxArray *mxCreateUninitNumericMatrix(mwSize m, mwSize n, mxClassID classid, mxComplexity flag); 

EXTERN_C宏扩展到extern "C"如果你正在使用C ++,否则在C中extern ,这样你得到正确的连接 。

在C(而不是C ++)中,任何未声明的函数都被假定为返回一个整数的外部函数(至少在GCC编译器中就是这种情况)。

似乎MathWorks已经监听并在mxCreateUninitNumericArray 记录mxCreateUninitNumericMatrixmxCreateUninitNumericArray 。 它们在matrix.h中声明如下:

 /* * Create an uninitialized numeric matrix. * The resulting array must be freed with mxDestroyArray. */ LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericMatrix(size_t m, size_t n, mxClassID classid, mxComplexity flag); /* * Create an uninitialized numeric array. * The resulting array must be freed with mxDestroyArray. */ LIBMMWMATRIX_PUBLISHED_API_EXTERN_C mxArray *mxCreateUninitNumericArray (size_t ndim, size_t *dims, mxClassID classid, mxComplexity flag); 

LIBMMWMATRIX_PUBLISHED_API_EXTERN_C根据包含的源是C还是C ++来计算为externextern C (对于MEX文件)。

mxCreateUninitNumericMatrix的官方文档指出:

调用mxCreateUninitNumericMatrix以创建一个2-D mxCreateUninitNumericMatrix ,其中所有数据元素都具有由classid指定的数字数据类型。 数据元素不被初始化。

mxCreateUninitNumericMatrix分配动态内存来存储创建的mxArray 。 调用mxDestroyArray来释放内存。

mxCreateUninitNumericArray文档是相似的。