Для генерации кода 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.
Рассмотрим следующий код MATLAB ®:
... if c > 0 x = 11; end % Later in your code ... if c > 0 use(x); end ...
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 ...
Рассмотрим следующий код 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 в операциях индексирования матриц для генерации кода.