Search code examples
matlabmex

Mex files: mxCreateXXX only inside main mexFunction()?


I have a very basic mex file example here:

#include "mex.h"
#include "matrix.h"

void createStructureArray(mxArray* main_array)
{
    const char* Title[] = { "first", "second" };
    main_array = mxCreateStructMatrix(1,1, 2, Title);
}


void mexFunction(mwSize nlhs, mxArray *plhs[], mwSize nrhs,
             const mxArray *prhs[])
{
    double* x = mxGetPr(prhs[0]);
    if (*x < 1.0)
    {
        //This works
        const char* Title[] = { "first", "second" };
        plhs[0] = mxCreateStructMatrix(1,1, 2, Title);
    }
    else
    {
      //This does not
      createStructureArray(plhs[0]);
    }
}

This function should always return a struct with the elements first and second. No matter the input, I expect the same output. However with an input parameter < 1, everything works as expected, but > 1 I get an error message:

>> a = easy_example(0.0)

a = 

 first: []
second: []

>> a = easy_example(2.0)
One or more output arguments not assigned during call to "easy_example".

Thus, can I not call the mxCreateStructMatrix function outside mexFunction, or did I do something wrong when passing the pointers?


Solution

  • You don't have a problem with mex but with pointers!

    Try to change your function to:

    void createStructureArray(mxArray** main_array)
    {
        const char* Title[] = { "first", "second" };
        *main_array = mxCreateStructMatrix(1,1, 2, Title);
    }
    

    and the function call to

    createStructureArray(&plhs[0]);
    

    Your problem is that plhs[0] is a mxArray, but in order to return it, you need to pass the pointer to that mxArray!