2011-01-13 8 views
6

Ich habe ein komplexes MATLAB-Simulink-Projekt mit vielen m-Dateien und mdl-Dateien. Einige M-Dateien definieren Variablen, die in anderen M-Dateien verwendet werden (schlechtes Design, ich weiß, aber es ist Legacy-Code). Es gibt auch Funktionen, die nicht mehr verwendet werden.Ungenutzte Variablen und Funktionen in einem MATLAB-Simulink-Projekt finden

Ich brauche einen automatischen Weg, um ungenutzte Variablen und Funktionen zu finden, damit ich sie löschen kann und das Ganze etwas weniger komplex machen kann. Idealerweise sollte ich ein Skript/Werkzeug haben, das den Namen des Wurzelverzeichnisses des Projekts als Eingabe verwendet, alle Dateien in Unterverzeichnissen durchsucht und alle Variablen und Funktionen ausgibt, die nicht in einer m-Datei oder MDL-Datei verwendet werden. Ich weiß, dass ich Variablen finden kann, die nicht in MDL-Dateien verwendet werden (siehe Tips and Tricks - Tracking Variables in a Simulink Model). Ich möchte diese Methode auf alle Dateien im Projekt anwenden.

Meine Idee, Variablen zu finden, die nicht in m-Dateien verwendet werden, besteht darin, alle m-Dateien vorübergehend in einer einzigen Datei zu vereinen und mlint darauf auszuführen. Irgendwelche besseren Ideen?

Antwort

7

Statt durch das langwierige gehen (und möglicherweise fehleranfällige) Aufgabe, alle Ihre m-Dateien in eine einfügen MLINT ausführen können, müssen Sie ein paar andere Optionen ...

Wenn Sie alle Ihre Dateien in einem Ordner, ist der einfachste Weg, um zum Browser für aktuelle Ordner zu gehen, klicken Sie auf Aktionen Schaltfläche , und wählen Sie dann Berichte> Code Analyzer Bericht.

alt text

Dies wird ein neues Fenster öffnen, die MLINT Ergebnisse für jede m-Datei im aktuellen Verzeichnis angezeigt wird:

alt text

Wenn Sie lieber den Prozess automatisieren würde ein Skript anstelle von Wenn Sie sich durch die Menüoptionen klicken, gibt es einige Eingaben im MathWorks File Exchange (here und here), die scheinbar rekursiv in einer Verzeichnisstruktur arbeiten, im Gegensatz zu nur einem einzigen Verzeichnis.

In weiteren, hier einige Beispielcode, der das tut, was Sie für ein einzelnes Verzeichnis wollen:

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 

Sie können die Sammlung von Dateinamen (und Pfade) auf diese Weise zu operate recursively on a directory tree, dann verlängern laufen MLINT auf die resultierende Menge von Dateien, die Sie sammeln.

+1

Danke, aber dies deckt nur einen Teil des Problems ab. Nehmen wir an, ich habe zwei Dateien f1.m und f2.m. f1.m ist wie folgt: a = 5; b = 3; f2 ist wie folgt: c = a * 2; b wird nicht verwendet, aber Code-Analyzer-Bericht sagt das nicht. – Samil

+0

@Samil: Das ist ein Problem, da diese nicht [Funktionen] sind (http://www.mathworks.com/help/techdoc/ref/function.html), sie sind [Skripte] (http: // www .mathworks.com/help/techdoc/ref/script.html). Da ein Skript in jedem Arbeitsbereich ausgeführt werden kann und nicht angegeben wird, welche Variablen in diesem Arbeitsbereich bereits vorhanden sind oder welche Variablen aus dem Skript später von einem anderen Skript oder einer anderen Funktion verwendet werden, müssen Sie möglicherweise alle Ihre Skriptdateien zusammenführen irgendwie zuerst MLINT effektiv zu laufen. Im Umgang mit Skripten kann ich nicht anders herum denken. – gnovice

Verwandte Themen