Генерация кода для рекурсивных функций

Чтобы сгенерировать код для рекурсивных функций MATLAB®, генератор кода использует рекурсию времени компиляции или рекурсию во время выполнения. Можно влиять, использует ли генератор кода время компиляции или рекурсию во время выполнения путем изменения кода MATLAB. См. Генератор кода Силы, чтобы Использовать Рекурсию Во время выполнения.

Можно запретить рекурсию или отключить рекурсию во время выполнения путем изменения параметров конфигурации.

Когда вы используете рекурсивные функции в коде MATLAB, который предназначается для генерации кода, необходимо придерживаться определенных ограничений. Смотрите Ограничения Рекурсивной функции для Генерации кода.

Рекурсия времени компиляции

С рекурсией времени компиляции генератор кода создает несколько версий рекурсивной функции в сгенерированном коде. Входные параметры к каждой версии имеют значения или размеры, которые настраиваются для той версии. Эти версии известны как функциональные специализации. Можно сказать, что генератор кода использовал рекурсию времени компиляции путем рассмотрения отчета генерации кода или сгенерированного кода C. Вот пример рекурсии времени компиляции в отчете.

Иногда, функциональные специализации не появляются в коде C/C++ из-за оптимизации. Например, рассмотрите эту функцию:

function y = foo()
%#codegen
    x = 10;
    y = sub(x);
end

function y = sub(x)
coder.inline('never');
if x > 1
    y = x + sub(x-1);
else
    y = x;
end
end

В отчете генерации кода, на вкладке Function List, вы видите функциональные специализации для функции MATLAB sub.

Однако код С не содержит специализации. Это содержит одну функцию, которая возвращает значение 55.

Рекурсия во время выполнения

С рекурсией во время выполнения генератор кода производит рекурсивную функцию в сгенерированном коде. Можно сказать, что генератор кода использовал рекурсию во время выполнения путем рассмотрения отчета генерации кода или сгенерированного кода C. Вот пример рекурсии во время выполнения в отчете.

Запретите рекурсию

  • В объекте настройки генерации кода, набор параметр конфигурации CompileTimeRecursionLimit к 0.

  • В приложении MATLAB Coder™, установленном значение предельной установки рекурсии Времени компиляции на 0.

Отключите рекурсию во время выполнения

Некоторые стандарты кодирования, такие как MISRA®, не позволяют рекурсию. Чтобы увеличить вероятность генерации кода, который совместим с MISRA C®, отключите рекурсию во время выполнения.

  • В объекте настройки генерации кода, набор EnableRuntimeRecursion к false.

  • В приложении MATLAB CODER набор Включает рекурсию во время выполнения к No.

Если ваш код требует рекурсии во время выполнения, и рекурсия во время выполнения отключена, необходимо переписать код так, чтобы это использовало рекурсию времени компиляции или не использовало рекурсию.

Ограничения рекурсивной функции для генерации кода

Когда вы используете рекурсию в коде MATLAB, который предназначается для генерации кода, следуйте за этими ограничениями:

  • Присвойте все выходные параметры рекурсивной функции во время выполнения перед первым рекурсивным вызовом в функции.

  • Присвойте все элементы массива ячеек выходные параметры рекурсивной функции во время выполнения.

  • Вводы и выводы рекурсивных функций во время выполнения не могут быть классами.

  • Максимальная установка использования стека проигнорирована для рекурсии во время выполнения.

Похожие темы

Была ли эта тема полезной?