GUÍA PARA LA DEPURACIÓN DEL CÓDIGO
Es normal que cuando estemos escribiendo código en cualquier lenguaje de programación cometamos errores. Por tanto una tarea muy importante del programador será depurar el código que ha escrito. Es decir descubrir los errores que ha cometido y corregirlos.
Aunque existen herramientas de depuración complejas en este curso vamos a utilizar solamente el compilador. De manera que veremos los mensajes que genera el compilador y actuaremos en consecuencia para solucionar los errores que hayamos cometido. Esta fase sería la de depuración durante la compilación. Además, una vez que tengamos el fichero ejecutable, veremos como se comporta el programa que hemos creado y si no lo hace como debía también debemos de arreglarlo. Esta fase sería la depuración durante la ejecución, quizá esta última sea la más compleja y la que deberéis ir aprendiendo a lo largo del curso.
A continuación se mostrará un ejemplo en el que se verá como se hace la depuración durante la compilación. Veréis que los errores que solemos cometer son siempre los mismos.
El ejemplo consiste en un programa que calcula la media de dos números un número de veces fijo especificado en la constante num_veces. El fichero original, con numerosos errores, se llama depuracion1.pas. A continuación se compilará este fichero y solucionaremos los errores que nos indica el compilador. El nuevo fichero con los cambios se llamará depuracion2.pas. Con este fichero volveremos a repetir el proceso.
El resultado de compilar depuracion1.pas es:
C:\Pascal\ejercicios\depuracion>ppc386 depuracion1
Free Pascal Compiler version
0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion1.pas
depuracion1.pas(9,17) Fatal: Syntax error ; expected
C:\Pascal\ejercicios\depuracion>
En la línea 9 hay un error de sintaxis, falta un ;. Vemos qué hay en la línea 9, el número de la línea se puede ver en el editor SuperIde, en la esquina inferior izquierda. En este caso la línea 9 es el nombre del programa, ¡Pero si tiene ;!
program calculo media;
El problema es que el nombre del programa debe ser sólo una palabra, y no dos como en este caso, así que cambiamos el nombre del programa a media.
program media;
El fichero resultante con el cambio es depuracion2.pas
El resultado de compilar depuracion2.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion2
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion2.pas
depuracion2.pas(13,3) Error: Duplicate identifier MEDIA
depuracion2.pas(13,9) Fatal: Syntax error : expected
C:\Pascal\ejercicios\depuracion>
El compilador "se queja" de que en el identificador MEDIA está duplicado. Es porque tenemos una variable que se llama media y el programa también se llama así. Esto no está permitido. Cambiemos el nombre de esta variable:
cambiamos de media:integer; a res:integer;
Pero también nos indica que hay un error de sintaxis y que faltan : en la linea 13. El problema es que, como ocurre con el nombre del programa, los nombres de las variables también deben ser sólo una palabra, y no dos como en este caso ocurre con la variable valor a, así que cambiamos el nombre de esa variable.
cambiamos de valor a:integer; a valor_a:integer;
El fichero resultante con el cambio es depuracion3.pas
El resultado de compilar depuracion3.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion3
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion3.pas
depuracion3.pas(14,11) Error: Identifier not found ITEGER
depuracion3.pas(14,17) Fatal: Syntax error .. expected
C:\Pascal\ejercicios\depuracion>
En la línea 14 no entiende el identificador iteger (claro como que no existe)
cambiamos de valor_b:iteger; a valor_b:integer;
El fichero resultante con el cambio es depuracion4.pas
El resultado de compilar depuracion4.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion4
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion4.pas
depuracion4.pas(19,3) Fatal: Syntax error : expected
C:\Pascal\ejercicios\depuracion>
En la línea 19 hay un error de sintaxis, faltan :. Puede que el compilador de un error en una linea y en realidad el error lo viene arrastrando de una linea anterior. Por ejemplo, aquí no encuentra los : porque cree que constant es una variable, no la reconoce como una palabra reservada, el problema es que la palabra reservada para las constantes es const y no constant
cambiamos de constant a const
El fichero resultante con el cambio es depuracion5.pas
El resultado de compilar depuracion5.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion5
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion5.pas
depuracion5.pas(19,12) Fatal: Syntax error = expected
C:\Pascal\ejercicios\depuracion>
En la línea 19 sigue habiendo un error de sintaxis, resulta que está esperando un = y se encuentra con otra cosa distinta. Para hacer la asignación de constantes se utiliza = y no := así que:
cambiamos de num_veces:=5; a num_veces=5;
El fichero resultante con el cambio es depuracion6.pas
El resultado de compilar depuracion6.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion6
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion6.pas
depuracion6.pas(22,12) Error: Illegal expression
depuracion6.pas(27,5) Fatal: Syntax error ; expected
C:\Pascal\ejercicios\depuracion>
En la línea 22 hay una expresión ilegal, es decir, algo que no está expresado correctamente. En esta línea se está haciendo una asignación de un valor a una variable usando el = , cuando para esto hay que utilizar := así que
cambiamos de control=1; a control:=1;
Además en la línea 27 hay un error de sintaxis. Al mirar la línea 27 no vemos nada extraño, así que miramos la de arriba. Efectivamente falta el último ; así que
cambiamos de readln(valor_a) a readln(valor_a);
El fichero resultante con el cambio es depuracion7.pas
El resultado de compilar depuracion7.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion7
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion7.pas
depuracion7.pas(25,5) Error: Identifier not found WRITENL
depuracion7.pas(30,13) Fatal: String exceeds line
C:\Pascal\ejercicios\depuracion>
En la línea 25 no reconoce el identificador writenl, el problema ha sido escribir mal esta palabra así que
cambiamos de writenl('Introduzca el primer número por favor '); a writeln('Introduzca el primer número por favor ');
Además en la línea 30 hay un problema con la cadena que se muestra. El problema es que no encuentra el final de la cadena, porque se nos ha olvidado la última comilla así que cambiamos de writeln('El resultado de su operacion es ,res:4:2); a writeln('El resultado de su operacion es ',res:4:2);
El fichero resultante con el cambio es depuracion8.pas
El resultado de compilar depuracion8.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion8
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion8.pas
depuracion8.pas(29,27) Warning: Using / will give a floating
point result
depuracion8.pas(29,27) Hint: use DIV instead to get an integer
result
depuracion8.pas(29,27) Error: Type mismatch
Fatal: Syntax error . expected
C:\Pascal\ejercicios\depuracion>
En la línea 29 tiene problemas con el tipo de variables. La media de los números introducidos puede ser real y estamos intentando meter el valor en una variable entera (por eso el type mismatch), además para números enteros se usa DIV mejor que /. En nuestro caso vamos a hacer que todas las variables sean reales en lugar de enteras así que cambiamos de
res:integer;
valor_b:integer;
valor_a:integer;
a
res:integer;
valor_b:integer;
valor_a:integer;
Indica el depurador también que falta un punto. Suele ocurrir que nos olvidemos del punto del último end. Así que cambiamos end por end.
El fichero resultante con el cambio es depuracion9.pas
El resultado de compilar depuracion9.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion9
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion9.pas
depuracion9.pas(16,3) Warning: Local variable not used OTRA
Assembling media
Linking depuracion9.exe
37 Lines compiled, 1.1 sec
C:\Pascal\ejercicios\depuracion>
¡Por fin ha generado un ejecutable! Pero sigue dando un mensaje de aviso. La variable OTRA no la hemos utilizado. Así que si no sirve para nada mejor quitarla, la eliminamos.
El fichero resultante con el cambio es depuracion10.pas
El resultado de compilar depuracion10.pas es:
C:\Pascal\ejercicios\depuracion>ppc386
depuracion10
Free Pascal Compiler version 0.99.8 [1998/09/29] for i386
Copyright (c) 1993-98 by Florian Klaempfl
Target OS: Win32
Compiling depuracion10.pas
Assembling media
Linking depuracion10.exe
36 Lines compiled, 1.2 sec
C:\Pascal\ejercicios\depuracion>
¡Por fin ha generado un ejecutable y sin ningún mensaje de aviso!
Ahora habría que depurar el funcionamiento del programa. Ejecutamos depuracion10.exe y... ¡El programa nunca termina! Es decir, que algo funciona mal en bucle porque nunca la condición resulta falsa y por tanto nunca se sale del bucle... Depurar el funcionamiento es un poco más complejo y lo iréis viendo a lo largo del curso. En este caso lo que ocurre es que la variable control, que controla el final del bucle la estamos decrementando en cada paso y no incrementando, esto hace que nunca llegue al final. Así que cambiamos control:=control-1; por control:=control+1;
El fichero resultante con el cambio es depuracion11.pas que está listo para compilar y funcionar.