Los atributos son operaciones predefinidas que se pueden aplicar a
tipos∞,
objetos∞ y otras entidades. Tienen la siguiente sintaxis:
Entidad'Atributo
o bien
Tipo'Atributo(Entidad)
||
Tabla de contenidos
[esconder] ~-
1 Atributos aplicables a tipos∞ ~-
2 Atributos aplicables a objetos∞ ~-
3 Ejemplos∞ ~-
4 Manual de referencia de Ada∞ ||
Atributos aplicables a tipos
Por ejemplo estos son algunos atributos aplicables a tipos:
- Last: Integer'Last es el máximo valor que puede tomar una variable de un tipo discreto, sea entero∞ o enumeración∞.
- First: Tipo'First es el mínimo valor que puede tomar una variable de un tipo discreto, sea entero o enumeració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).
- Size: mínimo espacio en bits en que se pueden almacenar objetos de este tipo. Técnicamente se define como lo que ocuparía un componente de un registro∞ de este tipo cuando el registro está empaquetado (pragma Pack).
- Truncation: El atributo Truncation se usa con la forma X'Truncation(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el valor truncado de Y a un valor entero.
- Digits: El atributo Digits representa el número de decimales de la mantisa de un tipo flotante.
- Ceiling: El atributo Ceiling se usa con la forma X'Ceiling(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el "techo" de Y, es decir el valor entero más pequeño que es mayor o igual que Y.
- Rounding: El atributo Rounding se usa con la forma X'Rounding(Y), siendo X cualquier tipo flotante e Y una variable de ese tipo. Devuelve el valor de Y redondeado al entero más cercano. Si Y está exactamente entre dos valores enteros, toma el valor del mayor entero (p.e, Float'rounding(1.5)=2.0)
Atributos aplicables a objetos
Por ejemplo estos son algunos atributos aplicables a
objetos∞:
- Size: tamaño en bits de un objeto.
- Valid: si tiene una representación válida para su tipo. Útil cuando se obtienen valores desde el «mundo exterior» mediante Unchecked_Conversion u otro mecanismo.
- First, Last: aplicados a arrays dan el primer y el último índices del array.
- 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.
Ejemplos
type∞ Tipo_enumerado
is∞ (Enum1, Enum2, Enum3);
for∞ Tipo_enumerado'Size
use∞ 2;
-- Para representar 3 unidades necesitamos 2 bits
type∞ Tipo_entero
is∞ range∞ -1 .. 5;
...
pragma∞ Assert∞ (Tipo_enumerado'Last = Enum3);
-- Correcto
pragma∞ Assert∞ (Tipo_entero'First = -1);
-- Correcto
pragma∞ Assert∞ (Tipo_entero'Last = 4);
-- ¡¡Incorrecto!!
pragma∞ Assert∞ (Tipo_enumerado'Pred( Enum2 ) = Enum1);
-- Correcto
pragma∞ Assert∞ (Tipo_enumerado'Succ( Enum2 ) = Enum3);
-- Correcto
type∞ Tipo_flotante
is∞ digits∞ 10
range∞ 0.0..100.0;
-- 10 cifras decimales en la mantisa
Var_Flotante : Float := 1.5;
Var_Flotante2 : Float := 1.9;
Var_Flotante3 : Float := 1.0;
Var_Flotante4 : Float := -1.8;
Var_Flotante5 : Float := 1.1;
...
pragma∞ Assert∞ (Float'Ceiling(var_Flotante) = 2.0);
-- Correcto
pragma∞ Assert∞ (Float'Ceiling(var_Flotante2) = 2.0);
-- Correcto
pragma∞ Assert∞ (Float'Ceiling(var_Flotante3) = 1.0);
-- Correcto
pragma∞ Assert∞ (Float'Ceiling(var_Flotante3) = 2.0);
-- ¡¡Incorrecto!!
pragma∞ Assert∞ (Float'Truncation(var_Flotante) = 1.0);
-- Correcto
pragma∞ Assert∞ (Float'Truncation(var_Flotante2) = 1.0);
-- Correcto
pragma∞ Assert∞ (Float'Truncation(var_Flotante3) = 1.0);
-- Correcto
pragma∞ Assert∞ (Float'Truncation(var_Flotante4) = -1.0);
-- Correcto
pragma∞ Assert∞ (Float'Rounding(var_Flotante5) = 1.0);
-- Correcto
pragma∞ Assert∞ (Float'Rounding(var_Flotante) = 2.0);
-- Correcto
A : Character := Character'Val (32)
-- A toma el valor de espacio (valor 32 en la tabla ASCII)
B : Character := ' ';
-- B también toma el valor de espacio
Resultado : Natural;
...
if∞ not∞ Resultado'Valid
then∞
-- 'Resultado' está fuera del rango, con valor negativo
Result := Natural'First;
end∞ if∞
Manual de referencia de Ada