Programación en Ada/Tipos
Clasificación de tipos
editarLos tipos de Ada se pueden clasificar en:
- Escalar:
- Discreto:
- Enteros: Integer, Natural, Positive.
- Enumeraciones: Boolean, Character.
- Real:
- Discreto:
Declaración de tipos
editarPara definir un tipo no estándar, se puede emplear el siguiente esquema:
declaración_tipo ::=type
identificadoris
definición_tipo ;
Sirvan como ejemplos las siguientes definiciones de tipos:
-- Escalares discretos no estándar:
--
type
TIndiceis
range
1..50;-- Escalares reales no estándar:
--
type
TPesois
digits
10;-- Coma flotante con precisión de 10 cifras.
type
TMasais
delta
0.01range
-12.0 .. 12.0;-- Coma fija 0.01 precis.
-- Enumeración:
--
type
TColoris
(ROJO, VERDE, AZUL);-- Vectores:
--
type
TMatrizis
array
(1..10, 1..10)of
Float;type
TVector5is
array
(TIndicerange
5..10)of
Float;-- Registros:
--
type
TVálvulais
record
Nombre: String(1..20); Abierta: Boolean; VelocidadLíquido: Floatrange
0.0 .. 30.0;end
record
;-- Punteros:
--
type
PEnterois
access
Integer;
-- Arrays irrestringidos. Tienen un número indefinido de
-- elementos. Es necesario especificar los límites al declarar
-- variables de ese tipo.
--
declare
type
TVectorIndefis
array
(Integerrange
<>)of
Float; V: TVectorIndef (1..4);begin
V(1) := 10.28; V := (1.2, 1.5, 1.8, 1.3); V := (1 => 1.2, 2 => 1.7,others
=> 0.0);end
;
Algunos atributos aplicables a tipos
editarLos atributos son operaciones predefinidas que se pueden aplicar a tipos, objetos y otras entidades. Por ejemplo estos son algunos atributos aplicables a tipos:
- Last: Integer'Last es el máximo valor que puede tomar la variable de tipo Integer. También es el último valor de un tipo enumerado o del índice de un vector.
- First: Integer'First es el mínimo valor que puede tomar la variable de tipo Integer. También es el primer valor de un tipo enumerado o del índice de un vector.
- Range: Vector'Range indica el rango que ocupa la variable Vector, es decir, equivale a Vector'First..Vector'Last. En el caso de más de una dimensión, el valor Matriz'Range(1) indica el rango de la primera dimensión.
- Succ: TColor'Succ(ROJO) indica el siguiente valor a ROJO que toma el tipo TColor, si no existe, se eleva la excepción Constraint_Error.
- Pred: TDía'Pred(VIERNES) indica el anterior valor a VIERNES que toma el tipo TDía, si no existe, se eleva la excepción Constraint_Error.
- Pos: El atributo Pos indica la posición ocupada por un determinado valor en un tipo enumeración. Por ejemplo: TColor'Pos(ROJO). La primera posición se considera 0.
- Val: El atributo Val indica el valor que ocupa una determinada posición en un tipo enumeración. Por ejemplo: COLOR'Val(1).
- Para identificar unívocamente un valor de un tipo enumeración se emplea TColor' (ROJO) y TIndicador'(ROJO) para distinguir el valor ROJO del tipo TColor o TIndicador.
Subtipos
editarLos subtipos definen un subconjunto de los valores de un tipo determinado, pero no son un tipo distinto de su tipo base.
Superar una ambigüedad
editarEn el supuesto caso de que se quiera superar una ambigüedad en el tipo de una variable (debería evitarse) en un determinado instante, se puede optar por convertirlo (no recomendable) o cualificarlo:
- Convertir el tipo, por ejemplo: Integer(I) convierte el número I a entero.
- Cualificar el tipo, por ejemplo: Integer'(I) interpreta I como entero.
En ambos casos, el resultado es I como entero.
La cualificación sirve para cuando un literal no se sabe a qué tipo pertenece y se le indica de ese modo. Por ejemplo:
...
type Color is (Rojo, Azul, Naranja);
type Fruta is (Naranja, Pera, Melon);
procedure Put (Una_Fruta : Fruta);
procedure Put (Un_Color : Color);
...
begin
Put (Color'(Naranja)); -- Llama a procedure Put (Un_Color : Color)
Put (Fruta'(Naranja)); -- Llama a procedure Put(Una_Fruta : Fruta)
Put (Naranja); -- Error de sintaxis, la llamada es ambigua
Put (Rojo); -- Ok, llama a procedure Put (Un_Color : Color)
end;
Tipos avanzados
editarHay otros tipos más avanzados en Ada. Puedes optar por leer estos tipos ahora o por continuar el libro por la siguiente lección Objetos (variables y constantes).