У меня есть маска в 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 : '='
Список функций 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
Если у вас есть определение структуры, вы можете привести к нему указатель параметра (я не проверял, но он должен работать, так как структура Matlab является непрерывным блоком памяти). Допустим, вы определяете свою структуру где-то в файле .h:
typedef struct {
double a;
double b;
} mystruct_t;
Затем:
mystruct_t *arg = (mystruct_t*)mxGetPr(initarg);
И вы можете получить доступ к его членам:
if (arg->a == 1) // or whatever