2011-12-13 4 views
3

mxAssert -macro를 matrix.h에 정의하여 mex가 완벽하게 컴파일되는 C++ 코드에 사용하고 있습니다. 나의 호출 된 mex 코드에서 어설 션이 위반되면이 어설 션은 내 프로그램이 충돌하지 않고 Matlab 자체를 손상시킵니다. 나는 무엇인가 놓치고 있습니까? 그 의도 된 행동인가? Matlab의 충돌 보고서를 볼 때, 그 원인은 matlab에서 mex 코드가 어설 션을 일으킨다 고 인식 할 수 있도록 내 mex 코드를 특정 방식으로 실행해야합니까? try-catch와 유사)? 아마도 mex 코드를 안전하게 중지하고 Matlab 프롬프트로 돌아갈 수있는 또 다른 방법이있을 것입니다.MEX 파일의 어설 션으로 인해 Matlab이 손상 될 수 있습니다.

미리 감사드립니다. 도움을 주시면 매우 감사하겠습니다!

편집 : 무릎에 내 MATLAB을 제공합니다 최소한의 예 : 내 시스템 (우분투 64)에

#include <matrix.h> 
class Temp { 
public: 
    Temp(); 
    virtual ~Temp(); 
}; 

Temp::Temp() { 
    // TODO Auto-generated constructor stub 
} 

Temp::~Temp() { 
    // TODO Auto-generated destructor stub 
} 

extern "C" { 
void mexFunction(int nlhs, mxArray *plhs[], int nrhs, const mxArray *prhs[]) { 
    int foo = 10; 
    mxAssert(foo==11, "foo is not 10"); 
} 
} 
+1

이렇게해서는 안됩니다. 어설 션 오류는 matlab 명령 행으로 돌아 가게한다. 간단한 mex를 먼저 시도해보고 코드가 여전히 실패하면 게시하십시오. – nimrodm

+0

몇 가지 코드를 게시 할 수 있습니까? – Nzbuu

답변

2

이 너무 충돌 코드가 명령 mex -v Temp.cpp -g

EDIT로 컴파일됩니다.

나는 그것이 어설트어 야 할 것이기 때문에 그것이 센스를 만든다고 생각합니다.

#define assert(isOK)  ((isOK) ? (void)0 : (void) mexErrMsgTxt("assert failed\n")) 

개별 오류 문자열을 인쇄하려면, 예를 들면 :

if(error){mexErrMsgTxt("assert failed\n");} 

그렇지 않으면, 내 친구 중 하나가 (전처리 지침) 다음과 같은 트릭이 있습니다

나는 강하게 당신 같은 것을 사용 조언 myassert(A=B,"A not B"),이에게 조금을 향상시킬 수 있습니다 : 등등 줄 번호를 인쇄하기 위해 ...

#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__ 

:

#define myassert(isOK,astr)  ((isOK) ? (void)0 : (void) mexErrMsgTxt(astr)) 

그는 또한이 같은 것을 사용 improvie 수 있다는 것을 저에게 말했다 .

+0

'mexErrMsgTxt'에 라인 번호 등의 전처리 변수를 어떻게 전달할 수 있습니까? – JaBe

+1

@JaBe, 좋은 질문입니다. 어쩌면 당신은 그것에 대해 새로운 C + + 질문을 만들 수 있습니다. – Oli

+0

예 참조 : http://stackoverflow.com/questions/28630530/how-to-print-c-preprocessor-variables-like-line-with-mexerrmsgtxt-in-matla – JaBe

관련 문제