exponenta event banner

Передать аргументы структуры по ссылке или по значению в сгенерированном коде

В этом примере показано, как управлять передачей аргументов структуры сгенерированным функциям точки входа по ссылке или по значению.

При передаче по ссылке для доступа к аргументам структуры используется указатель. Если функция записывает в элемент структуры ввода, она перезаписывает входное значение. При передаче по значению создается копия аргумента входной или выходной структуры. Чтобы сократить использование памяти и время выполнения, используйте pass by reference.

Если структурный аргумент является как входным, так и выходным, сгенерированная функция точки входа передает аргумент по ссылке. Сгенерированные функции MEX передают аргументы структуры по ссылке. Для вывода функции MEX нельзя указать, что требуется передавать аргументы структуры по значению.

Определение прохода по ссылке или по значению с помощью приложения MATLAB ® Coder App

Чтобы открыть диалоговое окно «Генерация», на странице «Генерация кода» щелкните стрелку «Генерация».

Задайте один из следующих типов построения:

  • Исходный код

  • Статическая библиотека

  • Динамическая библиотека

  • Исполняемый файл

Щелкните Дополнительные параметры.

На вкладке Все параметры (All Settings) установите для параметра Передать структуры по ссылкам на функции точки входа значение:

  • Да, для передачи по ссылке (по умолчанию)

  • Нет, для значения pass by

Задать проход по ссылке или по значению с помощью интерфейса командной строки

Создание объекта конфигурации кода для статической библиотеки, динамической библиотеки или исполняемой программы. Например, создайте объект конфигурации кода для статической библиотеки.

cfg = coder.config('lib'); 

Установите PassStructByReference свойство для:

  • true, для передачи по ссылке (по умолчанию)

  • false, для значения pass by

Например:

cfg.PassStructByReference = true;

Передать аргумент входной структуры по ссылке

Запись функции MATLAB my_struct_in имеет аргумент входной структуры.

< include > my _ struct _ in.m </include >

Определение структурной переменной 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 имеет аргумент структуры вывода.

< 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 передает структуру вывода 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 возвращает структуру вывода.

Передать аргумент структуры ввода и вывода по ссылке

Когда аргумент является и входом, и выходом, сгенерированная функция C передает аргумент по ссылке, даже когда PassStructByReference имеет значение false.

Запись функции 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.

Связанные темы