Структура в качестве аргумента инициализации в мекс-файле

У меня есть маска в Simulink, которая имеет поле аргумента инициализации. Аргумент 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 : '='

3

Решение

Список функций MEX, связанных с доступом к структурам, приведен ниже:

mxGetField
mxSetField
mxGetNumberOfFields
mxGetFieldNameByNumber
mxGetFieldNumber
mxGetFieldByNumber
mxSetFieldByNumber

Если у вас есть структура 1×1, вот как вы можете получить одно из значений:

mxArray *field_name = mxGetField(initArg, 0, "field_name");

Обратите внимание, что результатом является другой mxArray. Оттуда вы хотите обычный mxGetPr() для двойных массивов или других mxGet... для других типов данных.

Обратитесь к разделу документации MEX по C / C ++ Matrix Library для получения сведений об API этих функций: http://www.mathworks.com/help/matlab/cc-mx-matrix-library.html

1

Другие решения

Если у вас есть определение структуры, вы можете привести к нему указатель параметра (я не проверял, но он должен работать, так как структура Matlab является непрерывным блоком памяти). Допустим, вы определяете свою структуру где-то в файле .h:

typedef struct {
double a;
double b;
} mystruct_t;

Затем:

mystruct_t *arg = (mystruct_t*)mxGetPr(initarg);

И вы можете получить доступ к его членам:

if (arg->a == 1) // or whatever
1

По вопросам рекламы [email protected]