gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:42:52 25 4
gpt4 key购买 nike

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

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

mxGetN 返回 37str 似乎有问题(可能是 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");
...

最佳答案

您需要在调用 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 对象和访问 identifier 属性的代码没有问题。

关于c - 访问存储在 mxArray 中的对象的字符串属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27143245/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com