지금 당분간 다른 응용 프로그램에 대한 라이브러리 플러그인으로 사용될 Matlab 컴파일러를 사용하여 C 공유 라이브러리를 만들려고했습니다. 최근에 필자는 필자가 새롭게 개발 한 "Matlab Compiled"공유 라이브러리에서 호출 한 함수가 반환을 C 구조로 변환해야한다는 것을 깨닫기 위해이 작업을 완료했다고 생각했습니다.Matlab 코드에서 C 코드 (Matlab 컴파일러 사용)로 변환하는 방법
나는 나 구조를 반환해야 내 matlab에 함수를 호출하는 래퍼 레벨 2 기능을 만들 수 있도록 matlab에 답변 사이트에있는 예제를 사용했다. 내 문제는 변환에 MATLAB 반환 (http://www.mathworks.com/matlabcentral/answers/94715-how-do-i-wrap-matlab-compiler-4-8-r2008a-created-c-dlls-to-create-another-dll)
데이터를 C 데이터 아래의 코드 부분에 추가하십시오. int, double, chars 등으로 변환 할 수는 있지만 matlab에서 C 구조로 반환 한 mxArray에서 코드를 변환하는 방법을 알아 내려는 데 문제가 있습니다.
/* 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 프로그래밍에 새로운 오전으로 매트랩 컴파일러는 어떤 도움이 될 것이다 대단히 감사합니다!
감사합니다. 케이티, 나는 명확히해야 할 몇 가지 질문이 더 있습니다. 구조체 유형에 따라 공간을 할당하기 위해 malloc 호출을 변경해야합니까. 이는 데이터를 저장하려는 유형입니다. out2d에서 복사 한 데이터를 아래 구조와 비슷한 구조로 만들려면 어떻게해야합니까? 내 코드가 바뀐거야? 먼저 C 구조체를 설정 한 다음 memcpy를 사용하여 out2d 데이터를이 구조체로 옮길 필요가 있습니까? 'struct output2d { int variable1; double vairable2; char variable3 [10]; } ' – Dingess
구조체에 데이터를 저장하기위한 공간이 필요합니다. 미리'size'를 모른다면,'malloc' 할 필요가 있습니다. (당신이 그것을 안다면, 고정 된 크기의 2 차원 배열을 선언 할 수 있습니다.) 구조체는 여러분의 데이터를위한'double * matrix' 엘리먼트와 같은 것을 포함해야합니다. 그런 다음'output2d.matrix = malloc (sizeof (double) * size * size)'와'memcpy (output2d.matrix, mxGetPtr ...')를 할 수 있습니다. – Katie
내 코드를 보여주기 위해이 예제를 사용했습니다. 13 개의 데이터 필드를 가진 구조체 중 일부는 단순히 정수형으로 배열 (Matlab의 행렬)이고 하나는 문자열입니다. 먼저 구조체를 정의하면'output2d.element1 = malloc (sizeof (element1'stype) * size3 size)), memcpy (output2d.element1, mxGetpr (out2d) ...) 그리고 13 개의 모든 필드에 대해 반복 하시겠습니까? – Dingess