Утверждение в MEX-файле вызывает сбой Matlab - PullRequest
3 голосов
/ 13 декабря 2011

Я использую макрокоманду mxAssert, определенную matrix.h , в моем коде C ++, который mex прекрасно компилирует. Когда в моем вызываемом mex-коде нарушается утверждение, это приводит к сбою не моей программы, а самого Matlab. Я что-то упустил? Это намеренное поведение? Когда я смотрю отчет о сбое в Matlab, вызывающее утверждение является тем же самым, что и мой код, включая мое описательное описание ... Должен ли я запускать свой mex-код определенным образом, чтобы Matlab мог распознавать mex-код, вызвавший утверждения (аналогично попробовать-поймать)? Возможно, есть другой способ безопасно остановить мой mex-код и вернуться к приглашению Matlab.

Заранее спасибо, любая помощь очень ценится!

РЕДАКТИРОВАТЬ: код компилируется с помощью команды mex -v Temp.cpp -g

РЕДАКТИРОВАТЬ: минимальный пример, который ставит мой matlab на колени:

#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 Ответ

2 голосов
/ 16 февраля 2012

В моей системе (Ubuntu 64) тоже происходит сбой.

Полагаю, это делает senss, потому что это то, что должен делать assert.

Я настоятельно советую вам использовать что-то вроде:

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

В противном случае у одного из моих друзей есть следующий трюк (с инструкциями препроцессора):

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

Для печати отдельных строк ошибок, например, myassert(A=B,"A not B"), вы можете немного улучшить это:

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

Он также сказал мне, что вы можете импровизировать, используя что-то вроде:

#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__

... для печати номера строки и т. Д.

...