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

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

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

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

Задайте передачу по ссылке или по значению с помощью приложения MATLAB ® Coder

Чтобы открыть диалоговое окно Сгенерировать (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 по значению.

Передайте Структуру output аргумент по ссылке

Напишите функцию 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 по ссылке.

Передайте структуру output по значению

Укажите, что вы хотите передать аргументы структуры по значениям.

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.

Передайте Вход и Структуру 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.

Похожие темы