2011-12-13 57 views
3

我正在使用mxAssert -macro定义的matrix.h mex完美编译的C++代码。当我的被调用的mex代码违反断言时,这个断言不会导致我的程序崩溃,而是Matlab本身。我错过了什么吗?那是预期的行为? 当我看看Matlab的崩溃报告时,引起的断言与我的代码所引发的情况非常相似 - 包括我的描述性描述......我是否必须以某种方式运行我的mex代码,以便Matlab可以识别mex代码导致的断言类似于try-catch)? 也许还有另一种方法来安全地停止我的mex代码并返回到Matlab提示符。在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

这不应该发生。断言失败会让你回到matlab命令行。如果它仍然失败,先尝试一个简单的最小化mex并发布代码。 – nimrodm

+0

你能发表一些代码吗? – Nzbuu

回答

2

在我的系统(Ubuntu的64),它崩溃了。

我想它会使senss,因为这是断言应该做的。

我强烈建议你使用这样的:

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)) 

他还告诉我说,你可以使用它像improvie:

#isOK,__LINE__,__PRETTY_FUNCTION__, __FILE__ 

...为了打印行数等。

+0

如何将预处理器变量(比如行号等)传递给'mexErrMsgTxt'? – JaBe

+1

@JaBe,好问题。也许你可以对它做一个新的C++问题。 – Oli

+0

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