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

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

Когда вы задаете скалярную структуру путем присвоения переменной существующей ранее структуре, вы не должны задавать переменную перед присвоением. Однако, если бы вы уже задали ту переменную, она должна иметь тот же класс, размер и сложность как структура, которую вы присваиваете ей. В следующем примере 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 структуры генерирует ошибку.

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