存储在mxArray中的对象的访问字符串属性

时间:2014-11-26 07:13:01

标签: c matlab mex

我喜欢使用mexEvalString因为它很容易在mex中执行。但是,我得到了一些命令的异常,所以我想抓住它们以查看使用mexEvalStringWithTrap发生的事情,但是我无法从异常中获取字符串。

基本上它只是从对象中获取一个字符串,所以我找到了mxGetPropertymxGetString,但这段代码仍无效。输出为identifier: (null)

mxGetN返回37,但str似乎存在问题(可能是mxGetString的错误使用)

/* ENTRY POINT */
void mexFunction(int nlhs, mxArray *plhs[],
                 int nrhs, const mxArray *prhs[])
{    
    mxArray *except, *char_ident;
    mwSize strlen;
    char *str;

/* ARGUMENT VERIFICATION */
    //...
    // catch exception
    except = mexEvalStringWithTrap("unknownfunction");
    // get exception identifier
    char_ident = mxGetProperty(except, 0, "identifier");
    // get identifier string length
    strlen = (mwSize)mxGetN(char_ident);
    // get identifier string
    mxGetString(char_ident, str, strlen+1);
    // print identifier string
    printf("identifier: %s\n", str);
    mexEvalStringWithTrap("drawnow");
    ...

1 个答案:

答案 0 :(得分:1)

您需要在致电str之前分配mxGetString(尽管使用mxArrayToString可能更容易,但请参阅底部)。

<强> testMEXException.cpp

#include "mex.h"

void mexFunction(int nlhs, mxArray *plhs[],  int nrhs, const mxArray *prhs[])
{
    mxArray *except, *char_ident;
    mwSize strlen;
    char *str;

    // catch exception
    except = mexEvalStringWithTrap("unknownfunction");

    // get identifier string
    char_ident = mxGetProperty(except, 0, "identifier");
    strlen = (mwSize)mxGetN(char_ident);
    size_t buflen = strlen*sizeof(mxChar) + 1;
    str = (char*)mxMalloc(buflen);                  //  ALLOCATE
    mxGetString(char_ident, str, strlen + 1);

    // print identifier string
    printf("identifier: %s\n", str);
    mexEvalStringWithTrap("drawnow");

    // get message string
    char_ident = mxGetProperty(except, 0, "message");
    strlen = (mwSize)mxGetN(char_ident);
    buflen = strlen*sizeof(mxChar) + 1;
    str = (char*)mxRealloc(str, buflen);            //  REALLOCATE
    mxGetString(char_ident, str, strlen + 1);

    // print message string
    printf("message: %s\n", str);
    mexEvalStringWithTrap("drawnow");

    mxFree(str);                                    //  FREE
}

<强>输出

>> testMEXException
identifier: MATLAB:UndefinedFunction
message: Undefined function or variable 'unknownfunction'.

或者,使用mxArrayToString,它在内部为缓冲区分配足够的空间,用于输入mxArray中包含的整个字符串,但仍需要您释放它:

str = mxArrayToString(char_ident);
// use str ...
mxFree(str);

捕获MException对象并访问identifier属性的代码很好。