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

Определите переменные по назначению перед использованием

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

Назначение: Определяет:
a = 14.7;a как действительный двойной скаляр.
b = a;b со свойствами a (действительный двойной скаляр).
c = zeros(5,2);c как действительный массив типа double 5 на 2.
d = [1 2 3 4 5; 6 7 8 9 0];d как действительный массив типа double 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 + + следует придерживаться правила «one variable/one type»; то есть каждая переменная должна иметь определенный класс, размер и сложность. Обычно, если вы переназначили свойства переменной после начального назначения, вы получаете ошибку компиляции во время генерации кода, но существуют исключения, как описано в Reassignation of 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 в операциях индексирования матриц для генерации кода».

См. также

|

Похожие темы