От известно време се опитвам да създам C споделена библиотека с помощта на компилатор Matlab, който ще се използва като добавка в библиотека към друго приложение. Наскоро си помислих, че съм изпълнил тази задача само за да осъзная, че функцията, която извиквах от моята нова споделена библиотека „Компилирана от Matlab“, трябваше да преобразува връщането си в C структура.
Използвах примера, намерен на сайта на Matlab Answers, за да ми помогне да създам функцията wrapper level2, за да извикам моята Matlab функция, която трябва да върне структура. (http://www.mathworks.com/matlabcentral/answers/94715-how-do-i-wrap-matlab-compiler-4-8-r2008a-created-c-dlls-to-create-another-dll)
Проблемът ми е в частта Преобразуване на върнатите MATLAB данни в C данни на кода, който се намира по-долу. Мога да преобразувам в int, doubles, chars и т.н. добре, но имам проблеми да разбера как да кодирам преобразуването от mxArray, върнат от matlab, в C структура.
/* Wrapper for level 1 function exported by the MATLAB generated DLL *
* This function converts C data to MATLAB data, calls the MATLAB generated *
* function in level1.dll and then converts the MATLAB data back into C data */
int wmlfLevel1(double* input2D, int size, char* message, double** output2d){
int nargout=1;
/* Pointers to MATLAB data */
mxArray *msg;
mxArray *in2d;
mxArray *out2d=NULL;
/* Start MCR, load library if not done already */
int returnval=isMCRrunning();
if(!returnval)
return returnval;
/* Convert C data to MATLAB data */
/* IMPORTANT: this has to be done after ensuring that the MCR is running */
msg=mxCreateString(message);
in2d=mxCreateDoubleMatrix(size, size, mxREAL);
memcpy(mxGetPr(in2d), input2D, size*size*sizeof(double));
/* Call the M function */
returnval=mlfLevel1(nargout, &out2d, in2d, msg);
/*Convert returned MATLAB data to C data */
*output2d=(double *)malloc(sizeof(double)*size*size);
memcpy(*output2d, mxGetPr(out2d), size*size*sizeof(double));
/* Clean up MATLAB variables */
mxDestroyArray(msg);
mxDestroyArray(in2d);
mxDestroyArray(out2d);
return returnval;
}
Досега се опитах да използвам функцията mxCreateStructMatrix, опитах се да създам скелет на C структура, предстои ми да опитам функцията libstruct, но тъй като съм нов в програмирането на C и компилатора на Matlab, всяка помощ ще бъде много оценена!