Résumé des manipulations de tableaux :
- Création d'un tableau, première version :
[| elem1; elem2; ... elemN |]
- Création d'un tableau, seconde version :
Array.make taille motif
- Accès à l'élément d'indice
i
:tab.(i)
- Modification de l'élément d'indice
i
:tab.(i) <- nouvel_valeur
- Longueur d'un tableau :
Array.length tab
- Accès à un indice invalide :
exception Invalid_argument("Array.get")
- Modification à un indice invalide :
exception Invalid_argument("Array.set")
Pour les références, on distinguait la boite (le contenant) de son contenu. Ainsi b
est une boite, et !b
est son contenu. Pour les tableaux, ce n'est plus le cas. tab.(i)
est un compartiment (un contenant) dans lequel on peut mettre des valeurs, mais tab.(i)
désigne aussi le contenu de ce compartiment.
Alors que se passe-t-il lorsqu'on fait let x = tab.(i) in
? Réponse : on associe le nom x
à la valeur qui est contenue dans tab.(i)
au moment où l'on réalise cette déclaration. Si après cette déclaration on change le contenu de tab.(i)
, on ne changera pas la valeur de x
.
On va l'illustrer par un exemple. On déclare un tableau tab
, et on associe ensuite le nom x
au contenu de la case d'indice 0. Ensuite on modifie alors cette case, puis on affiche ensuite la valeur de x
.
let tab = [| 2; 5 |] in let x = tab.(0) in tab.(0) <- 3; print_int x;
Ce code affiche alors 2.
En d'autres termes, il n'est pas possible de donner un autre nom à une case du tableau comme on pouvait donner un alias à une référence. Ce qu'on peut faire en revanche, c'est écrire une fonction qui renvoie la valeur de la première case de tab
au moment où on l'appelle :
let tab = [| 2; 5 |] in let get_tab_0 () = tab.(0) in print_int (get_tab_0 ()); tab.(0) <- 3; print_int (get_tab_0 ());
Ce code affiche donc 2 puis 3.
Remarque : get_tab_0
est une fonction de type unit -> int
.
Comme il était possible de donner plusieurs noms à une même référence, il est possible de donner plusieurs noms à un tableau. Si tab
est un nom associé à un tableau et que l'on fait let t = tab in
, alors t
sera un autre nom associé au tableau.
On vérifie cela en modifiant t
et en montrant que tab
est aussi modifié :
let tab = [| 2; 5 |] in let t = tab in t.(0) <- 3; print_int tab.(0);
affiche 3.
Pour copier un tableau, c'est-à-dire créer un autre tableau contenant les mêmes valeurs que le premier, il faut utiliser la fonction Array.copy
.
La fonction Array.copy prend en paramètre un tableau et retourne un autre tableau, copie conforme du premier.
L'exemple suivant associe le nom t
à une copie du tableau tab
, et s'assure ensuite qu'une modification sur t
laisse tab
inchangé.
let tab = [| 2; 5 |] in let t = Array.copy tab in t.(0) <- 3; print_int tab.(0);
Ce programme affiche 2.