Найти неиспользуемые переменные и функции в проекте MATLAB-Simulink - PullRequest
6 голосов
/ 13 января 2011

У меня сложный проект MATLAB-Simulink, включающий множество m-файлов и mdl-файлов. Некоторые m-файлы определяют переменные, которые используются в других m-файлах (я знаю, что это плохой дизайн, но это устаревший код). Есть также функции, которые больше не используются.

Мне нужен автоматический способ поиска неиспользуемых переменных и функций, чтобы я мог их удалить и сделать все это немного менее сложным. В идеале у меня должен быть скрипт / инструмент, который принимает в качестве входных данных имя корневого каталога проекта, сканирует все файлы в подкаталогах и выводит все переменные и функции, которые не используются ни в одном m-файле или mdl-файле.

Я знаю, что могу найти переменные, которые не используются в mdl-файлах (см. Советы и рекомендации - Отслеживание переменных в модели Simulink ). Я хотел бы применить этот метод ко всем файлам в проекте.

Моя идея обнаружить переменные, не используемые в m-файлах, - временно объединить все m-файлы в один файл и запустить на нем mlint . Есть идеи получше?

1 Ответ

7 голосов
/ 18 января 2011

Вместо того, чтобы выполнять утомительную (и потенциально подверженную ошибкам) ​​задачу по вставке всех ваших m-файлов в один для запуска MLINT , у вас есть несколько других вариантов ...

Если у вас есть все файлы в одной папке, самый простой подход - перейти в браузер текущей папки, нажать кнопку Действия alt text, а затем выбрать Отчеты> Отчет анализатора кода .

alt text

Откроется новое окно, отображающее результаты MLINT для каждого m-файла в текущем каталоге:

alt text

Если вы предпочитаете автоматизировать процесс с помощью скрипта вместо того, чтобы щелкать по пунктам меню, в MathWorks File Exchange есть несколько предложений ( здесь и здесь )которые рекурсивно работают над структурой каталогов, а не с одним каталогом.

Кроме того, ниже приведен пример кода, который будет делать то, что вы хотите для одного каталога:

dirData = dir;                 %# Get data on the current directory contents
fileIndex = ~[dirData.isdir];                 %# Get an index for the files
fileNames = {dirData(fileIndex).name};        %# Get the file names
[~,~,ext] = cellfun(@fileparts,fileNames,...  %# Get the file extensions
                    'UniformOutput',false);
mFileIndex = strcmp(ext,'.m');                %# Get an index for the m-files
cellfun(@mlint,fileNames(mFileIndex));        %# Run MLINT on each m-file

Вы могли бы расширитьНайдите коллекцию имен файлов (и путей) таким образом, чтобы рекурсивно работал с деревом каталогов , затем запустите MLINT для полученного набора файлов, которые вы собираете.

...