我在我的C ++代码中使用{strong> matrix.h 定义的mxAssert
- 宏,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");
}
}
答案 0 :(得分:2)
在我的系统(Ubuntu 64)上,它也崩溃了。
我想这会让你感觉到,因为这就是断言应该做的事情。
我强烈建议你使用类似的东西:
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__
...以打印行号等。