TD 6 : Tableaux - Questions/réponses

Exercice 6.1 : Somme de deux tableaux

Exercice 6.1 : Somme de deux tableaux

par Amine Brikci-Nigassa,
Nombre de réponses : 2

Énoncé de l'exercice

Écrire une fonction qui prend en entrée trois tableaux d'entiers de même taille et qui range dans le troisième la somme des éléments des deux tableaux passés en paramètres.

Exemple


En réponse à Amine Brikci-Nigassa

Solution

par Amine Brikci-Nigassa,
void som2tab(int tab1[], int tab2[], int somme[], int taille)
{
for (int i=0 ; i<taille ; ++i) somme[i] = tab1[i] + tab2[i]; }
Remarque

L'énoncé ne parle que de trois paramètres (« une fonction qui prend en entrée trois tableaux d'entiers »). Nous avons ajouté le paramètre taille pour pouvoir indiquer à la fonction le nombre d'éléments à parcourir dans les tableaux (sans cela, elle ne pourrait pas savoir quand il faut s'arrêter !).

Programme complet

Voici un programme qui utilise cette fonction.

En réponse à Amine Brikci-Nigassa

Solution avec notation des pointeurs

par Amine Brikci-Nigassa,

Les tableaux ne sont pas des pointeurs, mais quand on écrit le nom d'un tableau dans une expression, le compilateur le traduit par l'adresse du premier élément de ce tableau.

En particulier, quand on appelle une fonction en lui donnant comme paramètre effectif un tableau, la valeur qui est transmise à la fonction au moment de l'appel est donc l'adresse du premier élément du tableau. Comme le paramètre effectif est la valeur qui est affectée à ce moment au paramètre formel (qui est une variable locale à la fonction), et comme on ne peut rien affecter à une variable de type tableau (on ne peut affecter des valeurs qu'à ses éléments), les paramètres formels déclarés dans une fonction ne sont pas vraiment de type tableau (comme peuvent le faire croire les crochets [] qui les suivent), mais plutôt de type pointeur, pour pouvoir recevoir l'adresse transmise.

On peut remplacer les paramètres « tableaux » d'une fonction qui sont écrits en utilisant la notation des crochets (exemple : int t[100]) par des pointeurs (int * t), de toute façon le compilateur le fait toujours automatiquement en traduisant (cela explique pourquoi on peut laisser les crochets vides :int t[]). La fonction de la solution précédente pourra donc être écrite :

void som2tab(int *tab1, int *tab2, int *somme, int taille)
{
for (int i=0 ; i<taille ; ++i) somme[i] = tab1[i] + tab2[i]; }

tab1, tab2 et somme sont des pointeurs. Ils l'étaient déjà dans la solution précédente puisque cette écriture est strictement équivalente. Cependant ils sont utilisés dans la boucle comme si c'était des tableaux, avec la notation des crochets. En effet, il ne faut pas croire que cette notation n'est utilisable qu'avec les tableaux : ce n'est que du sucre syntaxique que le compilateur traduit automatiquement par la notation des pointeurs. Par exemple, l'expression t[i] est toujours traduite par le compilateur comme *(t+i) et cela est vrai que t  soit un tableau ou un pointeur (si c'est un pointeur, c'est l'adresse qu'il contient qui est utilisée pour le calcul, si c'est un tableau, c'est l'adresse du premier élément du tableau, comme nous l'avons dit plus haut).

Voici enfin une version modifiée de la fonction où la boucle n'utilise pas la notation des crochets :

void som2tab(int *tab1, int *tab2, int *somme, int taille){
    for (int *p=somme ; p-somme<taille ; ++p)
        *p = *tab1++ + *tab2++;
}