next up previous contents index
Next: Programmation dynamique Up: No Title Previous: Pointeurs et tableaux

Représentation unidimensionnelle des matrices

      

Si on doit écrire des fonctions opérant sur des matrices dont la taille n'est pas connue, la représentation bidimensionnelle des matrices n'est pas utilisable. On représente alors une matrice par un tableau unidimensionnel, et les deux dimensions sont passées en arguments aux fonctions :

void f(int colonnes, int lignes, double t[]);

ou, ce qui est équivalent :

void f(int colonnes, int lignes, double *t);

Dans le corps de la fonction, on remplace un accès à la ieme ligne et la jeme colonne a[i][j] par un accès calculé à t[i * colonnes + j][*].

Par exemple, on pourra écrire une fonction d'initialisation de la façon suivante :

void init(int lignes, int colonnes, double t[]) {
  int i, j;
  for(i=0; i<lignes; i++) {
    for(j=0; j<colonnes; j++) {
      t[i * colonnes + j] = (double)(i+j)/2;
    }
  }
}

Après avoir défini un tableau t par

#define LIGNES 3
#define COLONNES 4
double t[LIGNES * COLONNES];

on l'initialisera en appelant la fonction init par

  init(LIGNES, COLONNES,t);

Pour appliquer ce genre de fonction à un vrai tableau bidimensionnel,

  double m[3][4];

on devra, soit lui passer en argument l'adresse du premier élément

  init(3, 4, &m[0][0]);

soit procéder à une coercition  :

  init(3, 4, (double *)m);

En effet, m étant un nom de tableau bidimensionnel, sa valeur est l'adresse de la première ligne, m[0], et c'est aussi l'adresse de son premier élément, m[0][0]. La coercition est nécessaire pour éviter un conflit entre le type du paramètre (dans la déclaration de init) et le type de l'argument (dans l'appel à init).


next up previous contents index
Next: Programmation dynamique Up: No Title Previous: Pointeurs et tableaux
Jean-Philippe Chancelier
9/29/1998