在mex文件中构造为init参数

时间:2013-12-05 16:19:00

标签: c++ c matlab simulink mex

我在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_typebbb_typeccc_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 : '='

2 个答案:

答案 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