В этом примере показано, как управлять, передаются ли аргументы структуры к сгенерированным функциям точки входа ссылкой или значением.
Передача ссылкой использует указатель, чтобы получить доступ к аргументам структуры. Если функция пишет в элемент входной структуры, она перезаписывает входное значение. Передача значением делает копию аргумента структуры ввода или вывода. Чтобы уменьшать использование памяти и время выполнения, используйте передачу ссылкой.
Если аргумент структуры является оба вводом и выводом, сгенерированная функция точки входа передает аргумент ссылкой. Сгенерированные 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
/* * File: my_struct_in.c * * MATLAB Coder version : 5.1 * C/C++ source code generated on : 30-Jul-2020 01:27:12 */ /* 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
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_in/my_struct_in.c
/* * File: my_struct_in.c * * MATLAB Coder version : 5.1 * C/C++ source code generated on : 30-Jul-2020 01:27:13 */ /* 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.
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
/* * File: my_struct_out.c * * MATLAB Coder version : 5.1 * C/C++ source code generated on : 30-Jul-2020 01:27:15 */ /* 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
Просмотрите сгенерированный код C.
type codegen/lib/my_struct_out/my_struct_out.c
/* * File: my_struct_out.c * * MATLAB Coder version : 5.1 * C/C++ source code generated on : 30-Jul-2020 01:27:17 */ /* 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
это имеет аргумент структуры, который является и входным параметром и выходным аргументом.
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
/* * File: my_struct_inout.c * * MATLAB Coder version : 5.1 * C/C++ source code generated on : 30-Jul-2020 01:27:18 */ /* 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
.