exponenta event banner

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

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

По умолчанию константы имеют тип 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 в операциях индексирования матриц для генерации кода.

См. также

|

Связанные темы