Можно снова использовать (повторно присваивают) входной параметр, выводят, или локальная переменная с различным классом, размером или сложностью, если генератор кода может однозначно определить свойства каждого возникновения этой переменной во время генерации кода 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®.