# 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

Los 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

La declaración básica de un array es la siguiente:
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:
    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

A 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.
Para lo que hay una forma más abreviada si no deseamos definir el subtipo con nombre, se puede hacer anónimamente:
Puesto que Primero y Último son expresiones del tipo Tipo_Índice, una forma más simple es la siguiente:
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:

### Con un subrango desconocido

A 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:
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

Los 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:
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.

## Uso de arrays

Para 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).
El operador "&" permite concatenar arrays:
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
## Manual de referencia de Ada

* 3.6 Array Types