3

mex が完全にコンパイルする C++ コードで、matrix.h で定義mxAssertされた-macroを使用しています。呼び出された mex コードでアサーションに違反すると、このアサーションによってプログラムがクラッシュするのではなく、Matlab 自体がクラッシュします。私は何かを逃していますか?それは意図した動作ですか?Matlab のクラッシュ レポートを見ると、原因となるアサーションは私のコードによって発生したものとまったく同じです - 私の記述的な説明を含めて... Matlab が mex コードによって引き起こされたアサーションを認識できるように、特定の方法で mex コードを実行する必要がありますか (同様のキャッチしようとする)?おそらく、mex コードを安全に停止して Matlab プロンプトに戻る別の方法があります。

事前に感謝します。どんな助けでも大歓迎です!

EDIT:コードはコマンドでコンパイルされます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");}

それ以外の場合、私の友人の 1 人が次のトリックを使用しています (プリプロセッサ命令を使用):

#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 に答える