Задайте скалярные структуры для генерации кода

Ограничения при определении скалярных структур назначением

Когда вы задаете скалярную структуру путем назначения переменной существующей структуре, вам не нужно определять переменную перед присвоением. Однако, если вы уже определили эту переменную, она должна иметь тот же класс, размер и сложность, что и назначенная ей структура. В следующем примере p определяется как структура, которая имеет те же свойства, что и предопределенная структура S:

...
S = struct('a',  0, 'b',  1, 'c',  2);
p = S;
...

Добавление полей в последовательном порядке на каждом пути потока управления

Когда вы создаете структуру, необходимо добавить поля в том же порядке на каждом пути потока управления. Например, следующий код генерирует ошибку компилятора, потому что он добавляет поля структуры x в разном порядке в каждом if предложение оператора:

function y = fcn(u) %#codegen
if u > 0
   x.a = 10;
   x.b = 20;
else
   x.b = 30;  % Generates an error (on variable x)
   x.a = 40;
end
y = x.a + x.b;

В этом примере присвоение x.a приходит перед x.b в первом if предложение оператора, но назначения появляются в обратном порядке в else пункт. Вот исправленный код:

function y = fcn(u) %#codegen
if u > 0
   x.a = 10;
   x.b = 20;
else
   x.a = 40;
   x.b = 30;
end
y = x.a + x.b;

Ограничение на добавление новых полей после первого использования

Вы не можете добавить поля в структуру после выполнения следующих операций в структуре:

  • Чтение из структуры

  • Индексация в массив структур

  • Передача структуры в функцию

Для примера рассмотрим этот код:

...
x.c = 10; % Defines structure and creates field c
y = x; % Reads from structure
x.d = 20; % Generates an error
...

В этом примере попытка добавить новое поле d после чтения из структуры x генерирует ошибку.

Это ограничение распространяется на иерархию структур. Например, вы не можете добавить поле в структуру после работы с одним из его полей или вложенных структур, как в этом примере:

function y = fcn(u) %#codegen

x.c = 10;
y = x.c;
x.d = 20; % Generates an error

В этом примере попытка добавить новое поле d в структуру x после чтения из поля структуры c генерирует ошибку.