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

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

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

Если аргумент структуры является оба вводом и выводом, сгенерированная функция точки входа передает аргумент ссылкой. Сгенерированные 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
/*
 * 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 значением.

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

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

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

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

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.

Похожие темы