Снова используйте ту же переменную с различными свойствами

Когда можно снова использовать ту же переменную с различными свойствами

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

 Пример 3. Переменное Повторное использование в операторе if

Чтобы видеть, как MATLAB переименовывает снова использованную переменную t:

  1. Создайте файл 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

  2. Сгенерируйте MEX-функцию для example1 и представьте отчет генерации кода.

    codegen -o example1x -report example1.m -args {ones(5,5)}

  3. Откройте отчет генерации кода.

    На вкладке Variables вы видите две исключительно именованных локальных переменные t>1 и t>2.

  4. В списке переменных нажмите t>1. Отчет подсвечивает экземпляры переменной t, которые являются в операторе if. Эти экземпляры t являются скаляром дважды.

  5. Нажмите t>2. Отчет генерации кода подсвечивает экземпляры t, которые являются за пределами оператора if. Эти экземпляры t являются вектор-столбцами переменного размера с верхней границей 25.

Ограничения переменного повторного использования

Следующие переменные не могут быть переименованы в сгенерированном коде:

  • Персистентные переменные.

  • Глобальные переменные.

  • Переменные передали коду С с помощью coder.ref, coder.rref, coder.wref.

  • Переменные, размер которых установлен с помощью coder.varsize.

  • Переменные, именами которых управляют с помощью coder.cstructname.

  • Индексная переменная for - цикл, когда это используется в теле цикла.

  • Блок выходные параметры блока MATLAB function в модели Simulink®.

  • Переменные, находящиеся в собственности графика функции MATLAB в графике Stateflow®.