next up previous contents index
Next: Tableaux de chaînes de Up: No Title Previous: Tableau résultat d'une fonction

Représentation des matrices par tableaux de pointeurs

     

La représentation unidimensionnelle des matrices permet d'écrire des fonctions opérant sur des matrices de taille quelconque. Elle présente cependant l'inconvénient de réaliser une multiplication (par le nombre de colonnes) pour chaque accès et contraint à une écriture moins naturelle du corps des fonctions.

Une autre représentation possible des matrices, qui n'a pas cet inconvénient, utilise un tableau de pointeurs.

On déclare une fonction opérant sur une matrice par

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

p[i] étant un pointeur de double, peut être utilisé comme l'adresse d'un tableau, qui sera la tex2html_wrap_inline6000 ligne de la matrice ; donc p[i][j] est un double, et on peut écrire simplement le corps de la fonction comme si p était une matrice. On écrira ainsi une fonction d'impression des éléments de la matrice :

void p_print(int lignes, int colonnes, double *p[]) {
  int i, j;
  for(i=0; i<lignes; i++) {
    for(j=0; j<colonnes; j++) {
      printf("a[%d][%d] = %f\n", i, j, p[i][j]);
    }
  }
}

Si l'on définit une variable comme un tableau de pointeurs, en donnant la dimension du tableau (qui correspond ici au nombre de lignes) :

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

   figure3094
Figure: Représentation d'une matrice par un tableau de pointeurs

La fonction d'initialisation doit comporter une phase d'allocation de chaque ligne du tableau ; on écrira par exemple

void p_alloc_init(int lignes, int colonnes, double *p[]) {
  int i, j;
  for(i=0; i<lignes; i++) {
    p[i] = (double *) malloc(colonnes * (sizeof(double)));
    for(j=0; j<colonnes; j++) {
      p[i][j] = (double) (i+j)/2;
    }
  }
}

On appellera ces fonctions d'initialisation-allocation et d'impression par

  p_alloc_init(LIGNES,COLONNES,p);
  p_print(LIGNES,COLONNES,p);

Une fonction qui fait un appel à malloc doit normalement être accompagnée d'une fonction faisant un appel à free. Quand p, allouée par p_alloc_init sera devenue inutile, on devra dés-allouer la mémoire au moyen de    

  p_free(LIGNES, p);

cette fonction étant définie par :

void p_free(int lignes, double *p[]) {
  int i;
  for (i=0; i<lignes; i++) {
    free(p[i]);
  }
}


Rene Lalement
Mon Sep 30 18:22:54 MET 1996