exponenta event banner

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

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

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