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

C 访问存储在mxArray中的对象的字符串属性,c,matlab,mex,C,Matlab,Mex,我喜欢使用mexEvalString,因为它很容易在mex中执行。但是,我得到了一些命令的异常,因此我想使用mexEvalStringWithTrap捕获它们以查看发生了什么,但是我无法从异常中获取字符串 基本上,它只是从一个对象中获取一个字符串,所以我找到了mxGetProperty和mxGetString,但这段代码仍然不起作用。输出为标识符:(空) mxGetN返回37,但是str似乎有问题(可能是mxGetString的用法有缺陷) 在调用mxGetString之前,您需要分配str(尽

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

基本上,它只是从一个对象中获取一个字符串,所以我找到了
mxGetProperty
mxGetString
,但这段代码仍然不起作用。输出为
标识符:(空)

mxGetN
返回
37
,但是
str
似乎有问题(可能是
mxGetString
的用法有缺陷)


在调用
mxGetString
之前,您需要分配
str
(尽管使用
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
对象和访问
标识符
属性的代码很好

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