Linux (GLNXA64) using mxCreateUninitNumericMatrix R2013b

218 views Asked by At

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?

2

There are 2 answers

0
Amro On BEST ANSWER

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).

0
chappjc On

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.