Previous Next Up Index Contents

10.5.5. Passage de l'adresse d'un tableau à deux dimensions

Exemple

Imaginons que nous voulons écrire une fonction qui calcule la somme de tous les éléments d'une matrice de réels A dont nous fournissons les deux dimensions N et M comme paramètres.

Problème

Comment pouvons-nous passer l'adresse de la matrice à la fonction ?

Par analogie avec ce que nous avons vu au chapitre précédent, nous pourrions envisager de déclarer le tableau concerné dans l'en-tête de la fonction sous la forme A[][]. Dans le cas d'un tableau à deux dimensions, cette méthode ne fournit pas assez de données, parce que le compilateur a besoin de la deuxième dimension du tableau pour déterminer l'adresse d'un élément A[i][j].

Une solution praticable consiste à faire en sorte que la fonction reçoive un pointeur (de type float*) sur le début de la matrice et de parcourir tous les éléments comme s'il s'agissait d'un tableau à une dimension N*M.

Cela nous conduit à cette fonction:

float SOMME(float *A, int N, int M)
{
 int I;
 float S;
 for (I=0; I<N*M; I++)
      S += A[I];
 return S;
}

Lors d'un appel de cette fonction, la seule difficulté consiste à transmettre l'adresse du début du tableau sous forme d'un pointeur sur float. Prenons par exemple un tableau déclaré par

float A[3][4];

Le nom A correspond à la bonne adresse, mais cette adresse est du type "pointeur sur un tableau de 4 éléments du type float". Si notre fonction est correctement déclarée, le compilateur la convertira automatiquement dans une adresse du type 'pointeur sur float'.

Toutefois, comme nous l'avons déjà remarqué au chapitre 9.3.4, on gagne en lisibilité et on évite d'éventuels messages d'avertissement si on utilise l'opérateur de conversion forcée ("cast").

Solution

Voici finalement un programme faisant appel à notre fonction SOMME:

#include <stdio.h>
main()
{
 /* Prototype de la fonction SOMME */
 float SOMME(float *A, int N, int M);
 /* Déclaration de la matrice */
 float T[3][4] = {{1, 2, 3, 4},
                  {5, 6, 7, 8},
                  {9,10,11,12}};
 /* Appel de la fonction SOMME */
 printf("Somme des éléments : %f \n",
                    SOMME((float*)T, 3, 4) );
 return 0;
}


Rappel

Rappelons encore une fois que lors de l'interprétation d'un tableau à deux dimensions comme tableau unidimensionnel, il faut calculer les adresses des composantes à l'aide du nombre de colonnes maximal réservé lors de la déclaration.


Remarque de Francois Donato donatofr@dmr.ca:

Une méthode plus propre pour éviter le cast

                 SOMME((float*)T, 3, 4) );
est de renvoyer explicitement l'adresse du premier élément du tableau:
                 SOMME(&T[0][0], 3, 4) );


Previous Next Up Index Contents

Feedback - Copyright © 1993,1996,1997 F.Faber