next up previous contents
Siguiente: Subtipos Subir: Tipos Anterior: Tipos   Índice General

Tipo enumerado

Ada nos permite especificar todos los posibles valores de un tipo. A este nuevo tipo se le llama tipo enumerado. Por ejemplo:

   1:  procedure Uso_De_Colores is
   2:     type T_Colores is (Rojo, Amarillo, Verde, Azul);
   3:     Color: T_Colores;
   4:  begin
   5:     Color := Rojo;
   6:     ...
   7:     if Color = Rojo then
   8:        ...
   9:     end if;
  10:   end Uso_De_Colores;

En la línea 2 definimos un nuevo tipo de datos. Se llama T_Colores y sus posibles valores son Rojo, Amarillo, Verde y Azul. En la línea 4 declaramos la variable Color, que puede almacenar cualquiera de los 4 valores del tipo T_Colores. En la línea 5 guardamos en la variable Color el valor Rojo y en la línea 7 consultamos el valor (mediante una frase if, que veremos en detalle en el capítulo 5).

La principal ventaja de crear tipos de datos propios para nuestro programa es que Ada nos facilita la detección de errores. Por ejemplo, el programa anterior es equivalente al siguiente:

   1:  procedure Uso_De_Colores is
   2:     Rojo     : constant Positive := 0;
   3:     Amarillo : constant Positive := 1;
   4:     Verde    : constant Positive := 2;
   5:     Azul     : constant Positive := 3;
   6:     Color    : Positive;
   7:  begin
   8:     Color := Rojo;
   9:     ...
  10:     if Color = Rojo then
  11:        ...
  12:     end if;
  13:   end Uso_De_Colores;

Sin embargo, este programa es peor que el anterior porque en la línea 8 podriamos asignar a Color el valor 12 y Ada no podría ayudarnos a detectar el error (el 12 es un número positivo y Color es una variable que almacena valores positivos, por lo que la operación es correcta). Además, este programa permite sumar, restar, multiplicar y dividir colores. ¿ Tiene eso algún sentido ? (la suma y la resta quizás si, pero el resto de las operaciones no sabemos qué pueden significar).

Los valores enumerados no tienen que ser siempre identificadores. También pueden ser caracteres. Por ejemplo:

   type T_Digito_Par is ('0', '2', '4', '6', '8');

Lo que no permite Ada es mezclar caracteres e identificadores en el mismo tipo enumerado. Por ejemplo:

   type T_Mezcla is (Grande, Pequeno, 'X', '9');   --  MAL !!!

Si dos tipos de datos diferentes tienen elementos cuyo nombre coincide, el uso de este elemento es ambiguo (Ada no sabe a cual de ellos nos referimos). Por ejemplo:

     type T_Colores is (Rojo, Amarillo, Naranja, Verde, Azul);
     type T_Frutas  is (Fresa, Naranja, Manzana); 

     --  Cuando utilicemos el elemento Naranja, podemos
     --   referirnos a un color o a una fruta.

Para resolver la ambiguedad debemos decir a Ada a qué enumerado nos referimos. Esto se conoce como cualificar el elemento con el tipo de dato al que pertenece. Por ejemplo:

     T_Colores'(Naranja) --  Para referirnos al color.
     T_Fruta'(Naranja)   --  Para referirnos a la fruta.

Como Ada asocia un valor numérico (el orden) a cada uno de los valores posibles de un tipo enumerado, podemos comparar los valores de un enumerado mediante los operadores $<$, $>$, etc. Por ejemplo:

       Rojo > Amarillo
          --  Falso, porque la posicion de rojo
          --  en nuestra declaracion no es posterior
          --  a la de amarillo.


next up previous contents
Siguiente: Subtipos Subir: Tipos Anterior: Tipos   Índice General
Javier Miranda 2002-10-03