Можно снова использовать (повторно присваивают) вход, выводят, или локальная переменная с различным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого вхождения этой переменной во время генерации кода C/C++. If so, MATLAB® создает отдельные исключительно именованные локальные переменные в сгенерированном коде. Можно просмотреть эти переименованные переменные в отчете генерации кода.
Типичный пример переменного повторного использования находится в if-elseif-else
или switch-case
операторы. Например, следующий функциональный example1
первое использование переменная t в if
оператор, где это содержит скаляр дважды, затем повторные использования t вне if
оператор, чтобы содержать вектор удваивается.
function y = example1(u) %#codegen if all(all(u>0)) % First, t is used to hold a scalar double value t = mean(mean(u)) / numel(u); u = u - t; end % t is reused to hold a vector of doubles t = find(u > 0); y = sum(u(t(2:end-1)));
Вы не можете снова использовать (повторно присваивают) переменные, если не возможно определить класс, размер и сложность вхождения переменной однозначно во время генерации кода. В этом случае переменные не могут быть переименованы, и ошибка компиляции происходит.
Например, следующий example2
функционируйте присваивает значение фиксированной точки x в if
оператор и повторные использования x, чтобы сохранить матрицу удваиваются в else
пункт. Это затем использует x после if-else
оператор. Эта функция генерирует ошибку компиляции потому что после if-else
оператор, переменная x может иметь различные свойства в зависимости от который if-else
пункт выполняется.
function y = example2(use_fixpoint, data) %#codegen if use_fixpoint % x is fixed-point x = fi(data, 1, 12, 3); else % x is a matrix of doubles x = data; end % When x is reused here, it is not possible to determine its % class, size, and complexity t = sum(sum(x)); y = t > 0; end
Чтобы видеть, как MATLAB переименовывает снова использованную переменную t
:
Создайте файл MATLAB example1.m
содержа следующий код.
function y = example1(u) %#codegen if all(all(u>0)) % First, t is used to hold a scalar double value t = mean(mean(u)) / numel(u); u = u - t; end % t is reused to hold a vector of doubles t = find(u > 0); y = sum(u(t(2:end-1))); end
Сгенерируйте MEX-функцию для example1
и представьте отчет генерации кода.
codegen -o example1x -report example1.m -args {ones(5,5)}
Откройте отчет генерации кода.
На вкладке Variables вы видите две исключительно именованных локальных переменные t>1
и t>2
.
В списке переменных нажмите t>1
. Отчет подсвечивает экземпляры переменной t
это в if
оператор. Эти экземпляры t
скаляр дважды.
Нажмите t>2
. Отчет генерации кода подсвечивает экземпляры t
это находится вне if
оператор. Эти экземпляры t
вектор-столбцы переменного размера с верхней границей 25
.
Следующие переменные не могут быть переименованы в сгенерированном коде:
Персистентные переменные.
Глобальные переменные.
Переменные передали коду С с помощью coder.ref
, coder.rref
, coder.wref
.
Переменные, размер которых установлен с помощью coder.varsize
.
Переменные, именами которых управляют с помощью coder.cstructname
.
Индексная переменная for
- цикл, когда это используется в теле цикла.
Блок выходные параметры блока MATLAB Function в модели Simulink®.
Переменные, находящиеся в собственности графика функции MATLAB в графике Stateflow®.