Informatica Grafica

C A P I T U L O6 Procedimientos

Un procedimiento es, en Tcl, lo que una función es en C, o un método en C++: un conjunto de comandos reunidos bajo un nombre, el nombre del procedimiento, que a partir de ese momento pasa a ser un comando más del lenguaje. Estos procedimientos son utilizados para automatizar el uso de una determinada secuencia de comandos. Dichos procedimientos prodrán estar en el mismo fichero que el programa principal o en otros ficheros, o incluso en otros directorios.

El comando proc

Un procedimiento en Tcl es definido con el comando proc. Toma tres argumentos:

proc nombre_procedimiento { parametros_procedimiento } {
cuerpo_del_procedimiento
}

El primer argumento es el nombre del procedimiento, que será añadido a al conjunto de comandos inteligibles por el intérprete. El segundo argumento es una lista de parámetros; y el tercero es el cuerpo del procedimiento.

Una vez definido, el procedimiento pasa a ser un comando más del lenguaje. Cuando es llamado, a cada argumento le es asignado el correspondiente parámetro y es evaluado en el cuerpo del procedimiento.

Como ya se explicó en el capítulo anterior, el procedimiento devolverá el resultado de la última operación realizada en él, a menos que se le indique otra cosa con el comando return. En el siguiente ejemplo, puede verse como no es imprescindible el uso de return..

Ejemplo 6-1
proc Prueba { a b c } {
expr $a+$b-$c
}
Prueba 12 10 2
20

la lista de parámetros para un procedimiento puede incluir valores por defecto

Ejemplo 6-2
proc Prueba { a b {c 2}} {
expr $a+$b-$c
}
Prueba 12 10
20

En este último caso, puede verse cómo el procedimiento es llamado con sólo dos argumentos, aunque debe recibir tres. Esto es así porque el tercer parámetro se ha definido como por defecto, y en caso de que se le pase a este parámetro un valor determinado, toma el dado por defecto.


Ámbito de las variables

El ámbito de una variable es el rango de comandos para los que dicha variable es visible. De esta manera, una variable declarada en un procedimiento sólo será accesible por los comandos que forman este procedimiento, pero no por los de otro.

Existe una forma de conseguir que una variable sea accesible desde cualquier punto del programa: declarar dicha variable como global con el comando global.

Cada procedimiento tiene un ámbito local para las variables, y estas sólo "viven" el tiempo que dura la ejecución de este. Después de que el procedimiento termina, estas variables se encuentran en un estado indefinido. Las variables definidas fuera del procedimiento no son visibles por él, a menos que se utilicen los comando upvar o global.

La declaración de varias variables con el mismo nombre en distintos ámbitos del programa, no ocasionaría ningún problema.

Ejemplo 6-3
set a 5 >
set b -8
proc Prueba { a } {
set b 42
if { $a < 0 } {
return $b
} else {
return $a
}
}
Prueba $b
42
Prueba [expr $a*2 ]
10

Como se puede ver, no existe ningún conflicto entre la variable "b" con valor -8, y la variable "b" perteneciente al procedimiento, ambas están en ámbitos diferentes, por lo que no se interfieren.


El comando global

El ámbito de variables del programa principal se denomina ámbito global. Este ámbito está fuera de cualquier procedimiento. Las variable definidas en el ámbito global pueden ser accesibles desde los procedimientos, si dentro de estos se declaran como globales con el comando global. La sintaxis de este comando es la siguiente:

global nom_var1 nom_var2 nom_var3 ...

Una vez que la variable se ha hecho accesible por un procedimiento, puede ser usada en el interior del procedimiento que la ha declarado global, como cualquier otra variable.

Una buena práctica consiste en agrupar todas las variables globales de un procedimiento en un array, de forma que a la hora de declarar como globales todas estas variables, bastará con declarar como global el array que las contiene, simplificando enormemente el código.

Por otro lado, la utilización de un gran número de variables globales es desaconsejable, por el peligro de modificaciones inadvertidas en los valores de las variable, y por ir en contra del criterio de encapsulación.

Ejemplo 6-5
proc Rellena_Ficha_Personal { nom ape dir tlf } {
global nombre apellido localidad telefono
set nombre $nom
set apellido $ape
set localidad $dir
set telefono $tlf
}
Rellena_Ficha_Personal Bartolomew Simpson Springfield 78787878
El procedimiento del ejemplo se utiliza para rellenar una ficha personal, y las variables que forman esta ficha deben de ser accesibles por otro procedimiento, por lo que se declaran como globales.

Una forma mejor de hacer esto sería:

Ejemplo 6-5
proc Rellena_Ficha_Personal { nom ape dir tlf } {
global Ficha
set Ficha(nombre) $nom
set Ficha(apellido) $ape
set Ficha(localidad) $dir
set Ficha(telefono) $tlf
}
Rellena_Ficha_Personal Bartolomew Simpson Springfield 78787878

De esta forma es más sencillo localizar las variables que son globales y pueden dar problemas por haber sido modificadas por algún procedimiento de forma inadvertida.

Previous Page Next Page


© 1995-98, etsimo WWW team
Última modificación: 19 de Agosto de 1998 - 17:50:12