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

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

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

“()” Присвоение: Задает:
a = 14.7;a как действительный двойной скаляр.
b = a;b со свойствами a (действительный двойной скаляр).
c = zeros(5,2);c как действительное 5 2 массив типа double.
d = [1 2 3 4 5; 6 7 8 9 0];d как действительное 5 2 массив типа double.
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 в Операциях Индексирования матриц для Генерации кода.

Индексируйте массивы при помощи векторов постоянного значения

Это - лучшая практика, чтобы использовать векторы постоянного значения, чтобы индексировать массивы вместо того, чтобы использовать области значений, которые содержат непостоянные объекты.

В некоторых случаях генератор кода не может определить ли выражение, содержащее colon оператор является фиксированным размером или переменным размером. Используйте векторы постоянного значения, чтобы индексировать массивы, чтобы препятствовать тому, чтобы они были излишне созданы как массивы переменного размера в сгенерированном коде.

Например, массив out был создан при помощи переменной i индексированный через случайный вектор-строку A.

...
% extract elements i through i+5 for processing
A = rand(1,10);
out = A(i:i+5); % If i is unknown at compile time, out is variable-size
...

Если i постоянное значение времени компиляции, генератор кода производит объект фиксированного размера для out. Если i неизвестно во время компиляции, генератор кода производит массив переменного размера для out в сгенерированном коде.

Чтобы препятствовать тому, чтобы генератор кода создал массивы переменного размера, предыдущий фрагмент кода переписан в этом шаблоне:

...
% extract elements i through i+5 for processing
A = rand(1,10);
out = A (i+(0:5)); % out is fixed-size, even if i is unknown at compile time
...

Этот шаблон позволяет вам сгенерировать массивы фиксированного размера, которые имеют значения итератора, неизвестные во время компиляции. Другой пример рекомендуемой перезаписи:

width = 25;              
A = A(j-width:j+width);  % A is variable-size, if j is unknown at compile time 
fsA = A(j+(-width:width)); % This makes A fixed-size, even if j is unknown at compile time
...

Смотрите также

|

Похожие темы