Этот пример показывает, как управлять, передаются ли аргументы структуры к сгенерированным функциям точки входа ссылкой или значением.
Передача ссылкой использует указатель, чтобы получить доступ к аргументам структуры. Если функция пишет в элемент входной структуры, она перезаписывает входное значение. Передача значением делает копию аргумента структуры ввода или вывода. Чтобы уменьшить использование памяти и время выполнения, используйте передачу ссылкой.
Если аргумент структуры является оба вводом и выводом, сгенерированная функция точки входа передает аргумент ссылкой. Сгенерированные MEX-функции передают аргументы структуры ссылкой. Для MEX-функции вывод вы не можете указать, что хотите передать аргументы структуры значением.
Чтобы открыть диалоговое окно Generate, на Сгенерировать Кодовой странице, нажимают стрелку Generate.
Установите тип Сборки на одно из следующего:
Исходный код
Статическая библиотека
Динамическая библиотека
Исполняемый файл
Нажмите More Settings.
На вкладке All Settings, набор структуры Передачи в отношении опции функций точки входа к:
Да, для передачи ссылкой (значение по умолчанию)
Нет, для передачи значением
Создайте объект настройки кода для статической библиотеки, динамической библиотеки или исполняемой программы. Например, создайте объект настройки кода для статической библиотеки.
cfg = coder.config('lib');
Установите свойство PassStructByReference
на:
true
, для передачи ссылкой (значение по умолчанию)
false
, для передачи значением
Например:
cfg.PassStructByReference = true;
Запишите функции MATLAB my_struct_in
, который имеет входной аргумент структуры.
function y = my_struct_in(s) %#codegen y = s.f;
Задайте переменную структуры mystruct
в рабочей области MATLAB®.
mystruct = struct('f', 1:4);
Создайте объект настройки генерации кода для статической библиотеки C.
cfg = coder.config('lib');
Укажите, что вы хотите передать аргументы структуры ссылкой.
cfg.PassStructByReference = true;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменного mystruct
.
codegen -config cfg -args {mystruct} my_struct_in
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_in/my_struct_in.c
/* * Prerelease License - for engineering feedback and testing purposes * only. Not for sale. * File: my_struct_in.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 11-Jul-2018 11:41:35 */ /* Include Files */ #include "my_struct_in.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
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_in/my_struct_in.c
/* * Prerelease License - for engineering feedback and testing purposes * only. Not for sale. * File: my_struct_in.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 11-Jul-2018 11:41:43 */ /* Include Files */ #include "my_struct_in.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
, который имеет выходной аргумент структуры.
function s = my_struct_out(x) %#codegen s.f = x;
Задайте переменный a
в рабочей области MATLAB®.
a = 1:4;
Создайте объект настройки генерации кода для статической библиотеки C.
cfg = coder.config('lib');
Укажите, что вы хотите передать аргументы структуры ссылкой.
cfg.PassStructByReference = true;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменного a
.
codegen -config cfg -args {a} my_struct_out
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_out/my_struct_out.c
/* * Prerelease License - for engineering feedback and testing purposes * only. Not for sale. * File: my_struct_out.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 11-Jul-2018 11:41:45 */ /* Include Files */ #include "my_struct_out.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
передает выходную структуру s
ссылкой.
Укажите, что вы хотите передать аргументы структуры значением.
cfg.PassStructByReference = false;
Сгенерируйте код. Укажите, что входной параметр имеет тип переменного a
.
codegen -config cfg -args {a} my_struct_out
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_out/my_struct_out.c
/* * Prerelease License - for engineering feedback and testing purposes * only. Not for sale. * File: my_struct_out.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 11-Jul-2018 11:41:46 */ /* Include Files */ #include "my_struct_out.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
возвращает выходную структуру.
Когда аргумент является и входным параметром и выводом, сгенерированная функция C передает аргумент ссылкой, даже когда PassStructByReference
является ложным.
Запишите функции MATLAB my_struct_inout
, который имеет аргумент структуры, который является и входным параметром и выходным аргументом.
function [y,s] = my_struct_inout(x,s) %#codegen y = x + sum(s.f);
Задайте переменный 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
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_inout/my_struct_inout.c
/* * Prerelease License - for engineering feedback and testing purposes * only. Not for sale. * File: my_struct_inout.c * * MATLAB Coder version : 4.1 * C/C++ source code generated on : 11-Jul-2018 11:41:48 */ /* Include Files */ #include "my_struct_inout.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
.