Programación en Ada / Atributos
De Wikilibros, la colección de libros de texto de contenido libre.
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 |
[editar] 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)
[editar] 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.
[editar] Ejemplos
typeTipo_enumeradois(Enum1, Enum2, Enum3);forTipo_enumerado'Sizeuse2; -- Para representar 3 unidades necesitamos 2 bitstypeTipo_enteroisrange-1 .. 5; ...pragmaAssert (Tipo_enumerado'Last = Enum3); -- CorrectopragmaAssert (Tipo_entero'First = -1); -- CorrectopragmaAssert (Tipo_entero'Last = 4); -- ¡¡Incorrecto!!pragmaAssert (Tipo_enumerado'Pred( Enum2 ) = Enum1); -- CorrectopragmaAssert (Tipo_enumerado'Succ( Enum2 ) = Enum3); -- Correcto
typeTipo_flotanteisdigits10range0.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; ...pragmaAssert (Float'Ceiling(var_Flotante) = 2.0); -- CorrectopragmaAssert (Float'Ceiling(var_Flotante2) = 2.0); -- CorrectopragmaAssert (Float'Ceiling(var_Flotante3) = 1.0); -- CorrectopragmaAssert (Float'Ceiling(var_Flotante3) = 2.0); -- ¡¡Incorrecto!!pragmaAssert (Float'Truncation(var_Flotante) = 1.0); -- CorrectopragmaAssert (Float'Truncation(var_Flotante2) = 1.0); -- CorrectopragmaAssert (Float'Truncation(var_Flotante3) = 1.0); -- CorrectopragmaAssert (Float'Truncation(var_Flotante4) = -1.0); -- CorrectopragmaAssert (Float'Rounding(var_Flotante5) = 1.0); -- CorrectopragmaAssert (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; ...ifnotResultado'Validthen-- 'Resultado' está fuera del rango, con valor negativo Result := Natural'First;endif

