2014-11-26 4 views
1

나는 mexEvalString을 사용하여 mex 내에서 실행하기가 쉽습니다. 그러나 어떤 명령에 대해서는 예외가 발생하므로 mexEvalStringWithTrap을 사용하여 어떤 문제가 있는지 파악하려고합니다. 그러나 예외에서 문자열을 가져 오는 데 실패합니다.mxArray에 저장된 객체의 액세스 문자열 속성

기본적으로 객체에서 문자열을 가져 오는 중이므로 mxGetPropertymxGetString을 찾았지만이 코드는 작동하지 않습니다. 출력 identifier: (null)

mxGetN 반환 37하지만 str (mxGetString 어쩌면 결함 사용)에 문제가있는 것 같습니다

당신은 그것을 쉽게 사용할 수 있지만 당신이 ( mxGetString를 호출하기 전에 str을 할당해야
/* ENTRY POINT */ 
void mexFunction(int nlhs, mxArray *plhs[], 
       int nrhs, const mxArray *prhs[]) 
{  
    mxArray *except, *char_ident; 
    mwSize strlen; 
    char *str; 

/* ARGUMENT VERIFICATION */ 
    //... 
    // catch exception 
    except = mexEvalStringWithTrap("unknownfunction"); 
    // get exception identifier 
    char_ident = mxGetProperty(except, 0, "identifier"); 
    // get identifier string length 
    strlen = (mwSize)mxGetN(char_ident); 
    // get identifier string 
    mxGetString(char_ident, str, strlen+1); 
    // print identifier string 
    printf("identifier: %s\n", str); 
    mexEvalStringWithTrap("drawnow"); 
    ... 

답변

1

mxArrayToString 대신 하단 참조).

testMEXException.cpp

#include "mex.h" 

void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) 
{ 
    mxArray *except, *char_ident; 
    mwSize strlen; 
    char *str; 

    // catch exception 
    except = mexEvalStringWithTrap("unknownfunction"); 

    // get identifier string 
    char_ident = mxGetProperty(except, 0, "identifier"); 
    strlen = (mwSize)mxGetN(char_ident); 
    size_t buflen = strlen*sizeof(mxChar) + 1; 
    str = (char*)mxMalloc(buflen);     // ALLOCATE 
    mxGetString(char_ident, str, strlen + 1); 

    // print identifier string 
    printf("identifier: %s\n", str); 
    mexEvalStringWithTrap("drawnow"); 

    // get message string 
    char_ident = mxGetProperty(except, 0, "message"); 
    strlen = (mwSize)mxGetN(char_ident); 
    buflen = strlen*sizeof(mxChar) + 1; 
    str = (char*)mxRealloc(str, buflen);   // REALLOCATE 
    mxGetString(char_ident, str, strlen + 1); 

    // print message string 
    printf("message: %s\n", str); 
    mexEvalStringWithTrap("drawnow"); 

    mxFree(str);         // FREE 
} 

출력

>> testMEXException 
identifier: MATLAB:UndefinedFunction 
message: Undefined function or variable 'unknownfunction'. 

대안 적으로, 입력 mxArray에 포함 된 전체 문자열을위한 충분한 공간이 내부 버퍼를 할당 mxArrayToString를 사용하지만 여전히 무료로 제공해야합니다.

str = mxArrayToString(char_ident); 
// use str ... 
mxFree(str); 

MException 개체를 캡처하고 identifier 속성에 액세스하는 코드는 문제가 없습니다.

+0

예, 'mxArrayToString'이 더 편리합니다. – embert