Arguments tableaux

Les tableaux ne sont jamais passés par valeur, c’est-à-dire jamais recopiés dans la pile (supposée trop petite pour une telle opération). Un argument de type int[] par exemple est en fait un pointeur sur son premier argument, et est donc un int* en réalité. Pour avoir une copie, il faut la réaliser soi-même en créant la place nécessaire dans le tas, puis en recopiant le tableau, et enfin en libérant la place utilisée en fin de fonction. Il est également possible de faire recopier le tableau en bloc à l’aide d’une structure (voir chapitre suivant).

Un problème se pose avec les tableaux multidimensionnels lorsqu’on n’en connaît pas les dimensions à la compilation. En effet, la procédure suivante, destinée à sommer tous les éléments d’un tableau à deux dimensions dont on indique le nombre de lignes et de colonnes, est incorrecte :

double somme_matr(int lgn, int col, double  matr[][])
{
     double somme = 0;
     for (int l = 0; l < lgn; l++) {
         for (int c = 0; c < col; c++)
             somme += matr[l][c];    // erreur ici
         }
     return somme;
}

En effet, le compilateur ne connaît pas le nombre de colonnes du tableau, même si la fonction le connaît, elle. En conséquence, il affiche Error : Size of this expression is unknown or zero, la taille de cette expression est inconnue ou nulle, exprimant ainsi son embarras.

Il existe deux solutions à ce problème. La première consiste à utiliser des structures adéquates, nous la verrons dans les chapitres suivants.

La seconde consiste à utiliser un type pointeur sur tableau, et à faire soi-même les opérations nécessaires :

double somme_matr(int lgn, int col, double  (*matr)[])
{
     double somme = 0;
     for (int l = 0; l < lgn; l++) {
         for (int c = 0; c < col; c++)
             somme += (*matr)[l*col +c];
         }
     return somme;
}

Cette solution n’est guère élégante, mais elle fonctionne. L’utilisation se fait très simplement ainsi :

double mat[2][3] = { {1, 2, 3}, {7, 8,  9} };
double d = somme(2, 3, mat);
Précédent Précédent Sommaire Sommaire Suivant Suivant