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) );