2011-01-13 11 views
6

Ho un progetto MATLAB-Simulink complesso che coinvolge molti m-file e file mdl. Alcuni m-file definiscono le variabili che sono usate in altri m-file (cattiva progettazione, lo so, ma è un codice legacy). Ci sono anche funzioni che non sono più utilizzate.Trova le variabili e le funzioni inutilizzate in un progetto MATLAB-Simulink

Ho bisogno di un modo automatico per trovare variabili e funzioni non utilizzate in modo che io possa cancellarle e rendere l'intera cosa un po 'meno complessa. Idealmente dovrei avere uno script/strumento che prenda come input il nome della directory principale del progetto, analizzi tutti i file in sottodirectory e restituisca tutte le variabili e le funzioni che non sono usate in nessun m-file o mdl-file.

So che posso trovare variabili che non vengono utilizzate nei file mdl (vedere Tips and Tricks - Tracking Variables in a Simulink Model). Vorrei applicare questo metodo a tutti i file nel progetto.

La mia idea di rilevare le variabili non utilizzate nei m-file è di combinare temporaneamente tutti i m-file in un singolo file ed eseguire mlint su di esso. Qualche idea migliore?

risposta

7

Invece di passare attraverso il noioso compito (e potenzialmente soggetto a errori) di incollare tutti i m-file in un unico a correre MLINT, si dispone di un paio di altre opzioni ...

Se si dispone di tutti i tuoi i file in una cartella, l'approccio più semplice è quello di andare al browser Cartella corrente, fare clic sul pulsante Azionialt text e quindi selezionare Report Report> Analizzatore di codice.

alt text

Si aprirà una nuova finestra che visualizza i risultati MLINT per ogni m-file nella directory corrente:

alt text

se si preferisce automatizzare il processo utilizzando uno script, invece di dovendo fare clic sulle opzioni di menu, ci sono un paio di invii sullo scambio di file di MathWorks (here e here) che sembrano funzionare in modo ricorsivo su una struttura di directory anziché su una singola directory.

In aggiunta, ecco alcuni esempi di codice che farà ciò che si desidera per una singola directory:

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 

Si potrebbe estendere la raccolta di nomi di file (e percorsi) in questo modo di operate recursively on a directory tree, quindi eseguire MLINT sul set di file risultante che raccogli.

+1

Grazie, ma questo copre solo una parte del problema. Diciamo che ho due file f1.m e f2.m. f1.m è come segue: a = 5; b = 3; f2 è come segue: c = a * 2; b non è usato ma il report dell'analizzatore di codice non lo dice. – Samil

+0

@Samil: Questo è un problema, poiché quelli non sono [funzioni] (http://www.mathworks.com/help/techdoc/ref/function.html), sono [script] (http: // www .mathworks.com/help/TECHDOC/ref/script.html). Dato che uno script può essere eseguito in qualsiasi spazio di lavoro, e non si può sapere quali variabili saranno già presenti in quell'area di lavoro o quali variabili dello script saranno successivamente utilizzate da un altro script o funzione, si dovrà semplicemente combinare tutti i file di script insieme in qualche modo prima di eseguire MLINT in modo efficace. Non riesco a pensare a un altro modo per aggirarlo quando si tratta di script. – gnovice

Problemi correlati