Programación en Ada/Atributos

← Objetos Atributos Expresiones →


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

editar

Por 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

editar

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

editar
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
pragma Assert (Tipo_enumerado'Image( Enum1 ) = "Enum1");   -- 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

editar