Programación en Ada/Atributos
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)
Atributos aplicables a tipos
editarPor ejemplo estos son algunos atributos aplicables a tipos (por orden alfabético):
- 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.
- Digits. Representa el número de decimales de la mantisa de un tipo flotante.
- First. Indica el mínimo valor que puede tomar una variable de un tipo discreto, sea entero o enumeración. Se usa con la forma T'First, siendo T un tipo discreto (entero o enumeración).
- Image. Se usa con la forma X'Image(Y), siendo X cualquier tipo discreto e Y una variable de ese tipo. Devuelve una cadena (String) con la representación del valor de la variable Y.
- Last. Indica el máximo valor que puede tomar una variable de un tipo discreto, sea entero o enumeración.
- 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.
- 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.
- 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).
- Size. Indica el 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).
- 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.
- 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.
- Val. Indica el valor que ocupa una determinada posición en un tipo enumeración. Por ejemplo: COLOR'Val(1).
Atributos aplicables a objetos
editarPor 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
editartype
Tipo_enumeradois
(Enum1, Enum2, Enum3);for
Tipo_enumerado'Sizeuse
2;-- Para representar 3 unidades necesitamos 2 bits
type
Tipo_enterois
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
pragma
Assert (Tipo_enumerado'Image( Enum1 ) = "Enum1");-- Correcto
type
Tipo_flotanteis
digits
10range
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'Validthen
-- 'Resultado' está fuera del rango, con valor negativo
Result := Natural'First;end
if