Для генерации кода 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
.
Примите во внимание следующий 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 + + следует придерживаться правила «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 в операциях индексирования матриц для генерации кода».