2011-01-13 12 views
6

Tengo un complejo proyecto MATLAB-Simulink que implica muchos archivos m y archivos mdl. Algunos archivos m definen variables que se usan en otros archivos m (diseño incorrecto, lo sé, pero es código heredado). También hay funciones que ya no se usan.Buscar variables y funciones no utilizadas en un proyecto de MATLAB-Simulink

Necesito una forma automática de encontrar las variables y funciones no utilizadas para poder eliminarlas y hacer que todo sea un poco menos complejo. Idealmente, debería tener un script/herramienta que toma como entrada el nombre del directorio raíz del proyecto, escanea todos los archivos en subdirectorios y genera todas las variables y funciones que no se usan en ningún archivo m o mdl.

Sé que puedo encontrar variables que no se utilizan en archivos mdl (consulte Tips and Tricks - Tracking Variables in a Simulink Model). Me gustaría aplicar ese método a todos los archivos del proyecto.

Mi idea para detectar variables no utilizadas en m-files es combinar temporalmente todos los archivos m en un solo archivo y ejecutar mlint en él. Alguna mejor idea?

Respuesta

7

lugar de pasar por la tediosa (y potencialmente propenso a errores) tarea de pegar todos sus archivos-m en una sola para ejecutar MLINT, tiene algunas otras opciones ...

Si usted tiene toda su archivos en una carpeta, el enfoque más simple es ir al navegador de la carpeta actual, haga clic en el botón Accionesalt text, y luego seleccione Informes> Informe del analizador de código.

alt text

Esto abrirá una nueva ventana que muestra los resultados MLINT para cada archivo-m en el directorio actual:

alt text

Si prefiere automatizar el proceso utilizando un script en lugar de al tener que hacer clic en las opciones de menú, hay un par de envíos en el intercambio de archivos de MathWorks (here y here) que parecen funcionar recursivamente en una estructura de directorio en lugar de solo un directorio.

En adicional, aquí es un código de ejemplo que va a hacer lo que quiere para un solo directorio:

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 

Se podría ampliar la colección de nombres de archivo (y caminos) de esta manera a operate recursively on a directory tree, a continuación, ejecutar MLINT en el conjunto resultante de archivos que recopila.

+1

Gracias, pero esto cubre solo una parte del problema. Digamos que tengo dos archivos f1.m y f2.m. f1.m es como sigue: a = 5; b = 3; f2 es como sigue: c = a * 2; b no se usa, pero el informe del analizador de código no lo dice. – Samil

+0

@Samil: Eso es un problema, ya que esas no son [funciones] (http://www.mathworks.com/help/techdoc/ref/function.html), son [guiones] (http: // www .mathworks.com/help/techdoc/ref/script.html). Como un script se puede ejecutar en cualquier espacio de trabajo, y no se sabe qué variables ya estarán presentes en ese espacio de trabajo o qué variables del script serán utilizadas posteriormente por otro script o función, puede que tenga que combinar todos los archivos del script de alguna manera primero para ejecutar MLINT de manera efectiva. No puedo pensar en otro camino cuando se trata de guiones. – gnovice

Cuestiones relacionadas