2015-01-15 5 views
0

지금 당분간 다른 응용 프로그램에 대한 라이브러리 플러그인으로 사용될 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 프로그래밍에 새로운 오전으로 매트랩 컴파일러는 어떤 도움이 될 것이다 대단히 감사합니다!

답변

1

mxGetPr은 단순히 포인터를 double 값의 버퍼로 반환합니다. malloc 호출은^2 개의 크기를 저장하기에 충분한 공간을 할당하고 있습니다. memcpy이 (가) out2d의 내부 저장소에서 버퍼로 데이터를 복사하고 있습니다.

버퍼는 1 차원이므로 행과 열을 기반으로 인덱스를 계산해야합니다. output2d[col * size + row]과 같은 것을 사용하여 특정 값에 액세스 할 수 있습니다. (이전 될 수 있습니다 - 지금은 문서에 액세스 할 수 없습니다.)

output2d으로 끝나면 free(output2d)으로 전화하여 메모리 할당을 취소해야합니다. 그렇지 않으면 코드에 메모리 누출.

+0

감사합니다. 케이티, 나는 명확히해야 할 몇 가지 질문이 더 있습니다. 구조체 유형에 따라 공간을 할당하기 위해 malloc 호출을 변경해야합니까. 이는 데이터를 저장하려는 유형입니다. out2d에서 복사 한 데이터를 아래 구조와 비슷한 구조로 만들려면 어떻게해야합니까? 내 코드가 바뀐거야? 먼저 C 구조체를 설정 한 다음 memcpy를 사용하여 out2d 데이터를이 구조체로 옮길 필요가 있습니까? 'struct output2d { int variable1; double vairable2; char variable3 [10]; } ' – Dingess

+0

구조체에 데이터를 저장하기위한 공간이 필요합니다. 미리'size'를 모른다면,'malloc' 할 필요가 있습니다. (당신이 그것을 안다면, 고정 된 크기의 2 차원 배열을 선언 할 수 있습니다.) 구조체는 여러분의 데이터를위한'double * matrix' 엘리먼트와 같은 것을 포함해야합니다. 그런 다음'output2d.matrix = malloc (sizeof (double) * size * size)'와'memcpy (output2d.matrix, mxGetPtr ...')를 할 수 있습니다. – Katie

+0

내 코드를 보여주기 위해이 예제를 사용했습니다. 13 개의 데이터 필드를 가진 구조체 중 일부는 단순히 정수형으로 배열 (Matlab의 행렬)이고 하나는 문자열입니다. 먼저 구조체를 정의하면'output2d.element1 = malloc (sizeof (element1'stype) * size3 size)), memcpy (output2d.element1, mxGetpr (out2d) ...) 그리고 13 개의 모든 필드에 대해 반복 하시겠습니까? – Dingess