C pointeurs/Tableau de double pointeur

Début de la boite de navigation du chapitre
Tableau de double pointeur
Icône de la faculté
Chapitre no 8
Leçon : C pointeurs
Chap. préc. :Double pointeur de double 3
Chap. suiv. :Matrices complexes
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « C pointeurs : Tableau de double pointeur
C pointeurs/Tableau de double pointeur
 », n'a pu être restituée correctement ci-dessus.


Introduction modifier

  • Pour approfondir ce travail : "Mathc".

Le but modifier

  • Des tableaux de matrices permet de travailler avec des boucles.

Les exemples modifier

  • Le premier exemple montre la méthode.
  • Le second exemple automatise le travail (boucle for).
  • Le troisième exemple nous montre qu’il n'y a aucune raison que les matrices soient toutes de tailles identiques.


La librairie modifier

  • Il faut utiliser la librairied'algèbre linéaire (n_1aa.zip).
  • Indispensable pour tester les exemples de cette page.
  • Le deuxième fichier n_1ab.zip donne des exemples sur les tableaux de matrices réelles et complexes.


Premier exemple modifier

  • On créé un tableau de double pointeur fixe (double **A[3];)
  • On fait pointer chaque élément du tableau sur une matrice.
  • Ne pas oublier de libérer chaque élément du tableau.

Code source modifier

/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
double **A[3];
time_t t;

  srand(time(&t));

int r = rp_I(5);
int c = rp_I(5);

     A[0] = r_mR(i_mR(r,c),9);
     A[1] = r_mR(i_mR(r,c),9);
     A[2] =      i_mR(r,c);


  printf(" A0 : ");
  p_mR(A[0],5,0,C6);

  printf(" A1 : ");
  p_mR(A[1],5,0,C6);

  add_mR(A[0],A[1],A[2]);

  printf(" A0plsA1 : ");
  p_mR(A[2],5,0,C6);

  f_mR(A[0]);
  f_mR(A[1]);
  f_mR(A[2]);

  printf(" Press return to continue \n");


  getchar();
  return 0;
}


Deuxième exemple modifier

  • L'intérêt des tableaux est d’utiliser une boucle.
  • Ici on initialise et on détruit le tableau dans une boucle for.
  • J’ai choisi de soulager la fonction main() en portant le maximum dans i_mR_An()

Code source modifier

/* ------------------------------------ */
#include "v_a.h"
/* ---------------------------------------------------  */
/* Initialisation d'un tableau de double pointeurs      */
/* Cette fonction dépend de la feuille de travail       */
/* Ici on veut des matrices de tailles alétoires [1..5] */
/* Initialiser avec des valeurs aléatoire [-9..9]       */
/* Ce travail est effectué ici pour soulager main()     */
/* ---------------------------------------------------  */
void i_mR_An(
double **A[],
int n
)
{
int i = 0;

int r = rp_I(5);
int c = rp_I(5);

  for(;i<n;i++) A[i] = r_mR(i_mR(r,c),9);
}
/* ------------------------------------ */
void f_mR_An(
double **A[],
int n
)
{
int i=0;

  for(;i<n;i++)f_mR(A[i]);
}
/* ------------------------------------ */
int main(void)
{
double **A[3];
int i=0;

time_t t;

  srand(time(&t));

  i_mR_An(A,3);

  add_mR(A[0],A[1],A[2]);

  for(;i<3;)
      {
       printf(" A%d : ",i);
         p_mR(A[i++],5,0,C6);
      }

  f_mR_An(A,3);

  printf(" Press return to continue \n");

  getchar();
  return 0;
}

Troisième exemple modifier

  • Le tableau à 100 matrices de tailles différentes.
  • Ne pas oublier de libérer chaque élément du tableau.

Code source modifier

/* ------------------------------------ */
#include "v_a.h"
/* ---------------------------------------------------  */
/* Initialisation d'un tableau de double pointeurs      */
/* Cette fonction dépend de la feuille de travail       */
/* Ici on veut des matrices de tailles alétoires [1..5] */
/* Initialiser avec des valeurs aléatoire [-9..9]       */
/*                                                      */
/*     LES MATRICES NON PAS TOUTES LA MEME TAILLE       */
/* ---------------------------------------------------  */
void i_mR_An(
double **A[],
int n
)
{
int i = 0;

  for(;i<n;i++) A[i] = r_mR(i_mR(rp_I(5),rp_I(5)),9);
}
/* ------------------------------------ */
void f_mR_An(
double **A[],
int n
)
{
int i=0;

  for(;i<n;i++)f_mR(A[i]);
}
/* ------------------------------------ */
int main(void)
{
double **A[100];
int i=0;

time_t t;

  srand(time(&t));

  i_mR_An(A,100);

  for(;i<100;)
      {
       printf(" A%d : ",i);
         p_mR(A[i++],5,0,C6);
      }

  f_mR_An(A,100);

  printf(" Press return to continue \n");

  getchar();
  return 0;
}

Conclusion modifier