Linux (GLNXA64) using mxCreateUninitNumericMatrix R2013b

孤街醉人 提交于 2020-01-02 23:16:03

问题


In one MEX file, I created an output matrix with the command (working fine):

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

For speedup I wanted to use the dynamic memory uninitialized, which lead me to the undocumented command:

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

working also very fine within Win32 and Win64.

Using exactly the same code within my Linux environment leads to the following warning from compiler:

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

and the code crashes, which show, that the returned integer value is not that one pointing to the correct memory address.

What can I do to use mxCreateUninitNumericMatrix?


回答1:


Undocumented MEX functions do not have a corresponding prototype in mex.h header file, so you'll have to explicitly write one yourself. In this case it will be:

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

The EXTERN_C macro expands to extern "C" if you are using C++, otherwise to extern in C, that way you get correct linkage.

In C (not C++), any undeclared functions are assumed to be external functions that return an integer (at least that's the case with GCC compiler I think).




回答2:


It seems that MathWorks has listened and made both mxCreateUninitNumericMatrix and mxCreateUninitNumericArray documented in R2015a. They are declared in matrix.h as follows:

/*
 * 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);

The macro LIBMMWMATRIX_PUBLISHED_API_EXTERN_C evaluates to extern or extern C (for MEX files), depending on whether the including source is C or C++.

The official documentation for mxCreateUninitNumericMatrix states:

Call mxCreateUninitNumericMatrix to create a 2-D mxArray in which all data elements have the numeric data type specified by classid. Data elements are not initialized.

mxCreateUninitNumericMatrix allocates dynamic memory to store the created mxArray. Call mxDestroyArray to deallocate the memory.

Documentation for mxCreateUninitNumericArray is similar.



来源:https://stackoverflow.com/questions/20516263/linux-glnxa64-using-mxcreateuninitnumericmatrix-r2013b

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!