- 1 - L'environnement de développement
- 2 - Premier programme
- 3 - Les variables
- 4 - Les structures de contrôle
- 5 - Les attributs, les énumerations
- 6 - Les tableaux
- 7 - Les sous-programmes
- 8 - Les types
- 9 - Les packages
- 10 - Le multi-tache
- 11 - Ecrire un programme pour le robot
- 12 - Utilisation de la lib PNG_Interface
- 13 - Exercice : SimpleForth
- 14 - Exercice : Startup_Manager
- 15 - Exercice : Gestion des déplacements
Un tableau est un ensemble fini d'objets du même type indicé. En Ada, on définit d'abord le type du tableau avant de déclarer un élément de ce type. La définition d'un type peut se placer n'importe où où la déclaration d'une variable est possible. En Ada, il y a deux types de tableaux : les tableaux contraints et les tableaux non contraints. Définition d'un type de tableauLes tableaux contraintsUn type tableau est contraint si sa taille est précisée lors de sa définition. La définition d'un type tableau contraint suit le schéma suivant :
type abc is (a, b, c); for abc use (a=>12, b=>37, c=>42); type t1 is array (1..10) of integer; type t2 is array (boolean, 5..12) of float; type t3 is array (abc) of t2; procedure p(N : Natural) is type t4 is array (1..N); ... Les tableaux non contraintsUn type tableau non contraint est un type de tableau qui ne précise que le type des éléments et les types des indices, mais pas explicitement l'ensemble d'indices, par exemple un ensemble de booléens indexé par des entiers, sans donner explicitement les entiers en question. En Ada, cela s'écrit :
Exemple:
type t is array (Interger range <>) of float; tbl1 : t(7..10); -- indices: 7..10 tbl2 : t := tbl1; -- meme indice que tbl1 tbl3 : t := (1.0, 2.0, 5.0) -- les indices commencent a Integer'First tbl4 : t(5..8) := tbl1 -- indices: 5..8; les valeurs sont copiees depuis tbl1 Utilisation des tableauxAccès aux élémentsUne fois qu'une variable de tableau a été déclarée, peu importe que le type d'origine soit contraint ou non, le tableau s'utilise de la même façon. Pour accéder à un élément d'un tableau t on utilise la syntaxe t(indice) Les attributs des tableauxComme les types, les tableaux ont des attributs. Il se note de la même façon que les autres attributs : nom_du_tableau'nom_de_l_attribut. Les plus importants sont :
Les agrégatsPour définir les valeurs d'un tableau, on peut remplir le tableau une case par une case ou utiliser une syntaxe beaucoup plus puissante : les agrégats. Le plus simple reste un exemple :
type t is (integer range <>) of integer; tbl1 : t(1..6) := (1|3=>2, others=>12); -- les elements 1 et 3 valent 2, les autres 12 tbl2 : t := (1..10 => 4); -- 10 elements qui valent 4 Les sous-tableauxOn peut créer un nouveau tableau à partir d'un tableau existant en spécifiant un intervalle à la place d'un indice. Ce nouveau tableau est un tableau comme un autre. Attention cependant, les indices des éléments de ce tableau sont les même que dans le tableau initial. Par exemple, si on dispose d'un tableau tbl indicé par 1..10, le sous-tableau tbl(tbl'Last-2..tbl'Last) sera indicé par 7..10. On peut changer ceci en déclarant explicitement les bornes d'un tableau avant de lui affecter un sous-tableau :
type t1 is array (integer range <>) of integer; tbl1 : t1(1..10); tbl2 : t1(1..3) := tbl1(tbl1'Last-2..tbl1'Last); La concaténationL'opérateur & permet de concaténer 2 tableaux de même type. On retrouve d'ailleurs la concaténation de chaines de caractères. En effet, une chaine de caractères est un élément du type String prédéfini par type String is array (Positive range <>) of Character;, concaténer 2 chaines revient donc à concaténer 2 tableaux et se fait donc par l'intermédiaire de l'opérateur &. ATTENTION : La taille d'une variable tableau est définie lors sa déclaration et ne peut plus jamais changer ensuite. Ansi, si T est un tableau T := T & T ne marche pas, car T & T a une taille 2 fois plus grande que T. De même avec les chaines de caractère :
with Text_IO; use Text_IO; procedure deux_ligne is line : String := Get_Line; begin Put_Line("1ere ligne: " & line); line := Get_Line; -- NE MARCHE PAS: line a deja une taille differente de celle -- de la nouvelle ligne Put_Line("2eme ligne: " & line); end deux_ligne; Ce code ne marche que si les 2 lignes lues ont exactement la même taille, sinon le programme lève une exception CONSTAINT_ERROR lorsque l'on tente d'affecter à line une chaine d'une autre taille.
|
|||||||||||||||||||||||||||



