Programmer en langage C
140
© Éditions Eyrolles
Ici, on pourrait, par analogie avec ce que nous avons dit pour un tableau à un indice, utiliser
d’autres formes de l’en-tête. Toutefois, il faut bien voir que, pour trouver l’adresse d’un élément quelconque d’un tableau à deux indices, le compilateur ne peut plus se contenter de
connaître son adresse de début ; il doit également connaître la seconde dimension du tableau
(la première n’étant pas nécessaire compte tenu de la manière dont les éléments sont disposés
en mémoire : revoyez le paragraphe 2). Ainsi, l’en-tête de notre fonction aurait pu être rau
(int t[][15]) mais pas rau (int t[][]).
En revanche, cette fois, quel que soit l’en-tête utilisé, cette fonction ne convient plus pour un
tableau de dimensions différentes de celles pour lesquelles elle a été prévue. Plus précisément,
nous pourrons certes toujours l’appeler, comme dans cet exemple :
int mat [12][20] ;
.....
raun (mat) ;
.....
Mais, bien qu’aucun diagnostic ne nous soit fourni par le compilateur, l’exécution de ces instructions placera 150 fois la valeur 1 dans certains des 240 emplacements de mat. Qui plus
est, avec des tableaux dont la deuxième dimension est inférieure à 15, notre fonction placerait
des 1... en dehors de l’espace attribué au tableau !
On pourrait songer, par analogie avec ce qui a été fait pour les tableaux à un indice, à mélanger
le formalisme pointeur et le formalisme tableau, à la fois dans l’en-tête et dans la définition de
la fonction ; cela pose toutefois quelques problèmes que nous allons évoquer dans l’exemple
suivant consacré à un tableau de dimensions variables (et dans lequel le formalisme précédent
n’est plus applicable).
b) Second exemple : tableau de dimensions variables
Supposons que nous cherchions à écrire une fonction qui place la valeur 0 dans chacun des
éléments de la diagonale d’un tableau carré de taille quelconque. Une façon de résoudre ce
problème consiste à adresser les éléments voulus par des pointeurs en effectuant le calcul
d’adresse approprié.
Fonction travaillant sur un tableau carré de taille variable
void diag (int * p, int n)
{
int i ;
for (i=0 ; i { * p = 0 ;
p += n+1 ;
}
}
Delannoy Livre.book Page 140 Mercredi, 6. mai 2009 4:26 16
Précédent

- 153/281

Suivant