Programación en Ada/Tipos/Arrays
Un array es una colección de elementos a los que se puede acceder por su índice. En Ada todo tipo definitivo (aquel del que se conoce su tamaño) se permite como elemento y cualquier tipo discreto, (es decir, enteros con signo y modulares, o enumeraciones) puede usarse como índice.
Declaración de arrays
editarLos arrays de Ada son de alto nivel, comparados, por ejemplo, con los de C/C++. Esto se traduce en varias posibilidades sintácticas que se presentan a continuación.
Sintáxis básica
editarLa declaración básica de un array es la siguiente:
array
(Tipo_Índice)of
Tipo_Elemento
Este array consiste en un elemento de tipo Tipo_Elemento por cada posible valor de Tipo_Índice. Por ejemplo, si quisieramos contar las ocurrencias de cada letra en un texto nos definiríamos un array de este tipo:
type
Contador_Caracteresis
array
(Character)of
Natural;
- Nota: usamos Natural como tipo de elemento puesto que los valores negativos de Integer no tienen sentido en una cuenta. Es conveniente usar el subtipo entero más adecuado en cada caso, puesto que así nos beneficiamos de la comprobación de rango y podemos descubrir errores fácilmente.
Con subrango conocido
editarA menudo no necesitamos un array con todos los valores posibles del tipo del índice. En este caso definimos un subtipo del tipo índice con el rango necesitado.
subtype
Subtipo_Índiceis
Tipo_Índicerange
Primero .. Último;array
(Subtipo_Índice)of
Tipo_Elemento;
Para lo que hay una forma más abreviada si no deseamos definir el subtipo con nombre, se puede hacer anónimamente:
array
(Tipo_Índicerange
Primero .. Último)of
Tipo_Elemento;
Puesto que Primero y Último son expresiones del tipo Tipo_Índice, una forma más simple es la siguiente:
array
(Primero .. Último)of
Tipo_Elemento
Ten en cuenta que si First y Last son literales numéricos, esto implica que el tipo índice base es el Integer.
Si en el ejemplo anterior, sólo deseásemos contar letras mayúsculas desechando otros caracteres, podríamos definir el tipo array de este modo:
type
Contador_Caracteresis
array
(Characterrange
'A' .. 'Z')of
Natural;
Con un subrango desconocido
editarA menudo el rango necesitado no se conoce hasta tiempo de ejecución o necesitamos objetos array de varias longitudes. En lenguajes de más bajo nivel como C necesitaríamos hacer uso de la memoria dinámica (del heap). Pero no es el caso de Ada, puesto que la caja <> nos permite declarar arrays de tamaño no restringido:
array
(Tipo_Índicerange
<>)of
Tipo_Elemento
Cuando declaramos objetos de este tipo, los extremos (bounds) del array deben conocerse, bien como resultado de una función o por una inicialización mediante un agregado. Desde su declaración hasta su finalización, el objeto no puede cambiar de tamaño.
Con elementos aliased
editarLos programadores de C/C++ dan por hecho que todo elemento de un array tiene una dirección propia en memoria (de hecho el nombre del array es un puntero sobre el que se puede operar).
En Ada, esto no es siempre así. Veamos este ejemplo:
type
Día_De_Mesis
range
1 .. 31;type
Día_Con_Citais
array
(Día_De_Mes)of
Boolean;pragma
Pack (Día_Con_Cita);
Puesto que hemos empaquetado el array, el compilador usará el mínimo espacio de almacenamiento posible. En la mayoría de los casos esto implica que los 8 valores booleanos cabrán en un byte.
Pero este no es el único caso en el que el compilador de Ada puede empaquetar un array puesto que tiene libertad en los casos en que sea más optimo.
Si queremos acceder con un puntero a cada elemento tenemos que expresarlo explícitamente.
type
Día_De_Mesis
range
1 .. 31;type
Día_Con_Citais
array
(Día_De_Mes)of
aliased
Boolean;
Uso de arrays
editarPara acceder a los elementos de un array se usan el nombre del objeto array seguido del índice entre paréntesis.
Se puede acceder a una rodaja (slice) de un array usando (x .. y).
Vector_A (1 .. 3) := Vector_B (4 .. 6);
El operador "&" permite concatenar arrays:
Nombre_Completo := Nombre & ' ' & Apellidos;
Si se intenta acceder a un elemento más alla de los límites del array o se asigna a un array (completo o slice) un array de distinto tamaño se levanta la excepción Constraint_Error (a menos que los chequeos estén deshabilitados).
Ejemplo de uso
editarwith
Ada.Text_IO, Ada.Integer_Text_IO;use
Ada.Text_IO, Ada.Integer_Text_IO;procedure
Agendais
type
Dia_De_Mesis
range 1 .. 31;type
Dia_Con_Citais
array (Dia_De_Mes)of
Boolean; Citas_En_Mayo : Dia_Con_Cita := (others
=> False);-- Se inicializa todo el mes a False
begin
-- Tengo citas los dias 3, del 8 al 16 (excepto el 14), y el último día del mes.
Citas_En_Mayo (3) := True; Citas_En_Mayo (8 .. 16) := (others
=> True); Citas_En_Mayo (14) := False; Citas_En_Mayo (Citas_En_Mayo'Last) := True; Put ("En mayo tienes citas los dias:"
);for
Iin
Citas_En_Mayo'Rangeloop
if
Citas_En_Mayo (I)then
Put (Dia_De_Mes'Image (I));end
if
;end
loop
;end
Agenda;