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

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

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

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

Задайте передачу ссылкой или значением Используя приложение MATLAB CODER

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

Похожие темы

Была ли эта тема полезной?