I'm learning how to use MEX files and I have a problem with using structures. I'm trying to convert to C a Matlab function that has a header like this:
writer = writeBit( writer, bit )
writer is a structure with four fields: buffer (1×1024 array interpreted as bytes), position (scalar), mask (scalar) and fileName (string).
I've created a mex file that looks like this:
#include <mex.h>#include <string.h>#include "writeBitC.h"void mexFunction( int nlhs, mxArray *plhs[ ], int nrhs, const mxArray *prhs[ ] ) {/*checking input & output params here*/const char *fieldNames[] = {"buffer", "position", "mask", "fileName" };mxArray* bufferArray = mxGetField( prhs[ 0 ], 0, fieldNames[ 0 ] );mxArray* positionArray = mxGetField( prhs[ 0 ], 0, fieldNames[ 1 ] );mxArray* maskArray = mxGetField( prhs[ 0 ], 0, fieldNames[ 2 ] );mxArray* fileNameArray = mxGetField( prhs[ 0 ], 0, fieldNames[ 3 ] );int bit = mxGetScalar( prhs[ 1 ] );writer.position = ( (unsigned int) mxGetScalar( positionArray ) ) - 1;writer.mask = (char) mxGetScalar( maskArray );writer.fileName = (char*) mxGetChars( fileNameArray );char* bufferDataPointer = (char*) mxGetChars( bufferArray );memcpy( writer.buffer, bufferDataPointer, BUFFER_SIZE );writeBitC( bit );memcpy( bufferDataPointer, writer.buffer, BUFFER_SIZE );int dims[ 1 ] = { 1 };plhs[ 0 ] = mxCreateStructArray( 1, dims, 4, fieldNames );mxSetField( plhs[ 0 ], 0, fieldNames[ 0 ], bufferArray );mxSetField( plhs[ 0 ], 0, fieldNames[ 1 ], mxCreateDoubleScalar( writer.position + 1 ) );mxSetField( plhs[ 0 ], 0, fieldNames[ 2 ], mxCreateDoubleScalar( writer.mask ) );mxSetField( plhs[ 0 ], 0, fieldNames[ 3 ], fileNameArray );}
writeBitC is the function that performs all the operations on the structure. The writer structure is defined like this:
struct __writer {char buffer[ BUFFER_SIZE ];unsigned int position;char mask;char* fileName;} writer;
writer is a global variable, so it's not passed to the writeBitC function as parameter. This code compiles but causes Matlab to freeze. I suspect that I did something wrong with the char arrays and memcpy function, but I can't track the bug :/ I would greatly appreciate some guidance.
Jan
Best Answer