3

我在 mex 完美编译的 C++ 代码中使用了mxAssert由 matrix.h 定义的-macro。当我调用的 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");
}
}
4

1 回答 1

2

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

我想这是有道理的,因为这是 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__

...为了打印行号等等。

于 2012-02-16T12:17:16.950 回答