В этом примере показано, как контролировать, передаются ли аргументы структуры в сгенерированные функции точки входа по ссылке или по значению.
Для доступа к аргументам структуры при передаче по ссылке используется указатель. Если функция записывает в элемент входа структуры, она перезаписывает вход значение. Передача значения делает копию входа или структуры output аргумента. Чтобы уменьшить использование памяти и время выполнения, используйте pass by reference.
Если аргумент структуры является входным и выходным, сгенерированная функция точки входа передает аргумент по ссылке. Сгенерированные MEX-функции передают аргументы структуры по ссылке. Для выхода MEX-функции нельзя указать, что вы хотите передать аргументы структуры по значению.
Чтобы открыть диалоговое окно Сгенерировать (Generate), на странице Сгенерировать код (Generate Code) щелкните стрелу Сгенерировать (Generate).
Установите тип сборки в одно из следующих значений:
Исходный код
Статическая библиотека
Динамическая библиотека
Исполняемый файл
Щелкните Дополнительные параметры.
На вкладке All Settings установите для опции Pass structures by reference to entry-point functions значение:
Да, для pass by reference (по умолчанию)
Нет, для прохода по значению
Создайте объект строения кода для статической библиотеки, динамической библиотеки или исполняемой программы. Например, создайте объект строения кода для статической библиотеки.
cfg = coder.config('lib');
Установите PassStructByReference
свойство для:
true
, для прохода по ссылке (по умолчанию)
false
, для прохода по значению
Для примера:
cfg.PassStructByReference = true;
Напишите функцию MATLAB my_struct_in
который имеет входной аргумент структуры.
< включить > my _ struct _ in.m </включить >
Задайте структурную переменную mystruct
в рабочей области MATLAB ®.
mystruct = struct('f', 1:4);
Создайте объект строения генерации кода для статической библиотеки на C.
cfg = coder.config('lib');
Укажите, что вы хотите передать аргументы структуры по ссылкам.
cfg.PassStructByReference = true;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменной mystruct
.
codegen -config cfg -args {mystruct} my_struct_in
Code generation successful.
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_in/my_struct_in.c
/* * File: my_struct_in.c * * MATLAB Coder version : 5.2 * C/C++ source code generated on : 21-Apr-2021 01:24:26 */ /* Include Files */ #include "my_struct_in.h" #include "my_struct_in_types.h" /* Function Definitions */ /* * Arguments : const struct0_T *s * double y[4] * Return Type : void */ void my_struct_in(const struct0_T *s, double y[4]) { y[0] = s->f[0]; y[1] = s->f[1]; y[2] = s->f[2]; y[3] = s->f[3]; } /* * File trailer for my_struct_in.c * * [EOF] */
Сгенерированная сигнатура функции для my_struct_in
является
void my_struct_in(const struct0_T *s, double y[4])
my_struct_in
передает структуру входа s
по ссылке.
Укажите, что вы хотите передать аргументы структуры по значениям.
cfg.PassStructByReference = false;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменной mystruct
.
codegen -config cfg -args {mystruct} my_struct_in
Code generation successful.
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_in/my_struct_in.c
/* * File: my_struct_in.c * * MATLAB Coder version : 5.2 * C/C++ source code generated on : 21-Apr-2021 01:24:28 */ /* Include Files */ #include "my_struct_in.h" #include "my_struct_in_types.h" /* Function Definitions */ /* * Arguments : const struct0_T s * double y[4] * Return Type : void */ void my_struct_in(const struct0_T s, double y[4]) { y[0] = s.f[0]; y[1] = s.f[1]; y[2] = s.f[2]; y[3] = s.f[3]; } /* * File trailer for my_struct_in.c * * [EOF] */
Сгенерированная сигнатура функции для my_struct_in
является
void my_struct_in(const struct0_T s, double y[4]
my_struct_in
передает структуру входа s
по значению.
Напишите функцию MATLAB my_struct_out
который имеет аргумент структуры output.
< include > my _ struct _ out.m </include >
Задайте переменную a
в рабочей области MATLAB ®.
a = 1:4;
Создайте объект строения генерации кода для статической библиотеки на C.
cfg = coder.config('lib');
Укажите, что вы хотите передать аргументы структуры по ссылкам.
cfg.PassStructByReference = true;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменной a
.
codegen -config cfg -args {a} my_struct_out
Code generation successful.
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_out/my_struct_out.c
/* * File: my_struct_out.c * * MATLAB Coder version : 5.2 * C/C++ source code generated on : 21-Apr-2021 01:24:30 */ /* Include Files */ #include "my_struct_out.h" #include "my_struct_out_types.h" /* Function Definitions */ /* * Arguments : const double x[4] * struct0_T *s * Return Type : void */ void my_struct_out(const double x[4], struct0_T *s) { s->f[0] = x[0]; s->f[1] = x[1]; s->f[2] = x[2]; s->f[3] = x[3]; } /* * File trailer for my_struct_out.c * * [EOF] */
Сгенерированная сигнатура функции для my_struct_out
является
void my_struct_out(const double x[4], struct0_T *s)
my_struct_out
передает структуру output s
по ссылке.
Укажите, что вы хотите передать аргументы структуры по значениям.
cfg.PassStructByReference = false;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменной a
.
codegen -config cfg -args {a} my_struct_out
Code generation successful.
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_out/my_struct_out.c
/* * File: my_struct_out.c * * MATLAB Coder version : 5.2 * C/C++ source code generated on : 21-Apr-2021 01:24:32 */ /* Include Files */ #include "my_struct_out.h" #include "my_struct_out_types.h" /* Function Definitions */ /* * Arguments : const double x[4] * Return Type : struct0_T */ struct0_T my_struct_out(const double x[4]) { struct0_T s; s.f[0] = x[0]; s.f[1] = x[1]; s.f[2] = x[2]; s.f[3] = x[3]; return s; } /* * File trailer for my_struct_out.c * * [EOF] */
Сгенерированная сигнатура функции для my_struct_out
является
struct0_T my_struct_out(const double x[4])
my_struct_out
возвращает структуру output.
Когда аргумент является и входом, и выходом, сгенерированная функция C передает аргумент по ссылке, даже когда PassStructByReference
является ложным.
Напишите функцию MATLAB my_struct_inout
который имеет аргумент структуры, который является и входным параметром, и выходным аргументом.
< include > my _ struct _ inout.m </include >
Задайте переменную a
и структурной переменной mystruct
в рабочей области MATLAB ®.
a = 1:4;
mystruct = struct('f',a);
Создайте объект строения генерации кода для статической библиотеки на C.
cfg = coder.config('lib');
Укажите, что вы хотите передать аргументы структуры по значениям.
cfg.PassStructByReference = false;
Сгенерируйте код. Укажите, что первый вход имеет тип a
и второй вход имеет тип mystruct
.
codegen -config cfg -args {a, mystruct} my_struct_inout
Code generation successful.
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_inout/my_struct_inout.c
/* * File: my_struct_inout.c * * MATLAB Coder version : 5.2 * C/C++ source code generated on : 21-Apr-2021 01:24:34 */ /* Include Files */ #include "my_struct_inout.h" #include "my_struct_inout_types.h" /* Function Definitions */ /* * Arguments : const double x[4] * const struct0_T *s * double y[4] * Return Type : void */ void my_struct_inout(const double x[4], const struct0_T *s, double y[4]) { double b_y; b_y = ((s->f[0] + s->f[1]) + s->f[2]) + s->f[3]; y[0] = x[0] + b_y; y[1] = x[1] + b_y; y[2] = x[2] + b_y; y[3] = x[3] + b_y; } /* * File trailer for my_struct_inout.c * * [EOF] */
Сгенерированная сигнатура функции для my_struct_inout
является
void my_struct_inout(const double x[4], const struct0_T *s, double y[4])
my_struct_inout
передает структуру s
по ссылке, хотя PassStructByReference
является false
.