Лучшые практики для Определения Переменных для Генерации кода C/C++

Задайте переменные присвоением перед использованием их

Для генерации кода C/C++ необходимо явным образом и однозначно задать класс, размер и сложность переменных перед использованием их в операциях или возврате их как выходные параметры. Задайте переменные присвоением, но обратите внимание, что присвоение копирует не только значение, но также и размер, класс и сложность, представленную тем значением новой переменной. Например:

“()” Присвоение: Задает:
a = 14.7;a как действительный двойной скаляр.
b = a;b со свойствами a (действительный двойной скаляр).
c = zeros(5,2);c как действительное 5 2 удваивается массив.
d = [1 2 3 4 5; 6 7 8 9 0];d как действительное 5 2 удваивается массив.
y = int16(3);y как действительный 16-битный целочисленный скаляр.

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

Данные, которые вы присваиваете переменной, могут быть скаляром, матрицей или структурой. Если ваша переменная является структурой, задайте свойства каждого поля явным образом.

Инициализация новой переменной к значению присвоенных данных иногда приводит к избыточным копиям в сгенерированном коде. Чтобы избежать избыточных копий, можно задать переменные, не инициализируя их значения при помощи coder.nullcopy создайте как описано в, Устраняют Избыточные Копии Переменных в Сгенерированном коде.

Когда вы задаете переменные, они локальны по умолчанию; они не сохраняются между вызовами функции. Чтобы сделать переменные персистентными, смотрите persistent.

 Пример 1. Определение переменной для нескольких путей к выполнению

Рассмотрите следующий код MATLAB®:

...
if c > 0
  x = 11;
end
% Later in your code ...
if c > 0
  use(x);
end
...
Здесь, x присвоен только если c > 0 и используемый только, когда c > 0. Этот код работает в MATLAB, но генерирует ошибку компиляции во время генерации кода, потому что это обнаруживает, что x не определен на некоторых путях к выполнению (когда c <= 0).

Чтобы сделать этот код подходящим для генерации кода, задайте x перед использованием его:

x = 0;
...
if c > 0
  x = 11;
end
% Later in your code ...
if c > 0
  use(x);
end
...

 Пример 2. Определение полей в структуре

Рассмотрите следующий код MATLAB:

...
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Try to use s
use(s);
...
Здесь, первая часть if оператор использует только поле a и else пункт использует поля a и b. Этот код работает в MATLAB, но генерирует ошибку компиляции во время генерации кода C/C++, потому что это обнаруживает несоответствие типов структуры. Чтобы предотвратить эту ошибку, не добавляйте поля в структуру после того, как вы выполните определенные операции на структуре. Для получения дополнительной информации см. Определение Структуры для Генерации кода.

Чтобы сделать этот код подходящим для генерации кода C/C++, задайте все поля s перед использованием его.

...
% Define all fields in structure s
s = struct(‘a’,0, ‘b’, 0);
if c > 0 
  s.a = 11;
  disp(s);
else
  s.a = 12;
  s.b = 12;
end
% Use s
use(s);
...

Соблюдите осторожность при переприсвоении переменных

В общем случае необходимо придерживаться "одного переменного/одного типа" правило для генерации кода C/C++; то есть, каждая переменная должна иметь определенный класс, размер и сложность. Обычно, если вы повторно присваиваете переменные свойства после начального присвоения, вы получаете ошибку компиляции во время генерации кода, но существуют исключения, как описано в Переназначении Variable Properties.

Используйте операторы броска типа в определениях переменной

По умолчанию константы имеют тип double. Чтобы задать переменные других типов, можно использовать операторы броска типа в определениях переменной. Например, следующий код задает переменную y как целое число:

...
x = 15; % x is of type double by default.
y = uint8(x); % y has the value of x, but cast to uint8.
...

Задайте матрицы прежде, чем присвоить индексируемые переменные

При генерации кода C/C++ из MATLAB вы не можете вырастить переменную путем записи в элемент вне его текущего размера. Такие операции индексации производят ошибки времени выполнения. Необходимо задать матрицу сначала прежде, чем присвоить значения ее элементам.

Например, следующее начальное присвоение не позволено для генерации кода:

g(3,2) = 14.6; % Not allowed for creating g
               % OK for assigning value once created

Для получения дополнительной информации об индексации матриц, смотрите Несовместимость с MATLAB в Операциях Индексирования матриц для Генерации кода.