我在simulink中有一个带有init参数字段的掩码。我的案例中的init参数是一个结构。现在我想在.ccp中使用这个结构(制作一个mex文件)。
void init()
{
mxArray *initarg = GetInitArg();
...
}
GetInitArg()
是:
#ifndef GET_INIT_ARG
#define GET_INIT_ARG
mxArray *GetInitArg() {
return rtsys->initArg;
}
#endif
当initarg是int
时,我可以在void init()
中以这种方式调用它:
int arg = (int)mxGetPr(initarg)[0];
现在,如果initarg是一个Matlab结构,我该怎么办?
修改
我尝试使用@remus回答。
我的结构看起来像这样:
typedef struct
{
const char *task;
aaa_type aaa;
bbb_type bbb;
ccc_type ccc;
} arg_t;
结构aaa_type
,bbb_type
和ccc_type
的定义如下:
typedef struct
{
double p1;
double p2;
double p3;
double p4;
double p5;
double p6;
} aaa_type;
我试着像这样得到init arg:
void init()
{
mxArray *initarg = GetInitArg();
arg_t arg* = (arg_t*)mxGetPr(initarg);
...
}
但是在arg_t行我遇到两个编译错误:
error C2143: syntax error : missing ';' before '*'
error C2059: syntax error : '='
答案 0 :(得分:1)
与访问结构相关的MEX功能列表如下:
mxGetField
mxSetField
mxGetNumberOfFields
mxGetFieldNameByNumber
mxGetFieldNumber
mxGetFieldByNumber
mxSetFieldByNumber
如果您有1x1结构,请按以下方式获取其中一个值:
mxArray *field_name = mxGetField(initArg, 0, "field_name");
请注意,结果是另一个mxArray。从那里你需要通常的mxGetPr()
用于双数组,或者其他mxGet...
用于其他数据类型。
有关这些功能的API详细信息,请参阅C / C ++ Matrix Library的MEX文档部分:http://www.mathworks.com/help/matlab/cc-mx-matrix-library.html
答案 1 :(得分:1)
如果你有结构定义,那么你可以将参数指针强加给它(我没有测试但它应该工作,因为Matlab结构是一个连续的内存块)。假设您在.h文件中的某处定义了结构:
typedef struct {
double a;
double b;
} mystruct_t;
然后:
mystruct_t *arg = (mystruct_t*)mxGetPr(initarg);
您可以访问其成员:
if (arg->a == 1) // or whatever