Leçons de niveau 14

Introduction au langage C/Double pointeur de double

Une page de Wikiversité.
Sauter à la navigation Sauter à la recherche
Début de la boite de navigation du chapitre
Double pointeur de double
Icône de la faculté
Chapitre no 14
Leçon : Introduction au langage C
Chap. préc. :Tableau de pointeurs de fonctions 2
Chap. suiv. :Double pointeur de double 2
fin de la boite de navigation du chapitre
Icon falscher Titel.svg
En raison de limitations techniques, la typographie souhaitable du titre, « Introduction au langage C : Double pointeur de double
Introduction au langage C/Double pointeur de double
 », n'a pu être restituée correctement ci-dessus.


Introduction[modifier | modifier le wikicode]

Présentation[modifier | modifier le wikicode]

Double pointeur de double.

  • Pour nous ce sera un travail sur les matrices.

Ce cours en deux parties va vous présenter la création et la destruction de matrices de la librairie "Mathc".

Le but[modifier | modifier le wikicode]

Cela vous permettra :


  • Soit de construire votre propre méthode de création de matrices.
  • Soit de construire votre propre librairie à partir de ces deux méthodes.
  • Soit de commencer votre apprentissage de la méthode "mathc".


Exemple d'utilisation de la librairie[modifier | modifier le wikicode]

Copie d'un tableau dans une matrice[modifier | modifier le wikicode]

  • Pour récupérer la librairied'algèbre linéaire (n_1aa.zip).
  • Indispensable pour tester les exemples de cette page.
  • Le deuxième fichier n_1ab.zip sera pour l'étude des tableaux de matrices.
/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
double a[R2*C3]={ 1,2,3,
                  4,5,6};

double **A = i_mR(R2,C3);

  c_a_A_mR(a,A);

  printf(" a[r*c] -> A : \n\n");
  p_mR(A,0,0,C6);

  f_mR(A);
  getchar();

  return 0;
}


Présentation des fonctions :

double**A=i_mR(R2,C3); Initialiser une matrice réelle
  • Deux lignes (rows)
  • Trois colonnes (columns)
c_a_A_mR(a,A); Copier le tableau "a" dans la matrice "A"
p_mR(A,T,V,C); Imprimer la matrice "A"
  • T espaces entre les nombres
  • V chiffres après la virgule.
  • C colonnes par lignes.
f_mR(A); Libérer l'espace alloué à la matrice "A"
  • On ne passe pas la taille de la matrice en argument dans les fonctions.


Additionner deux matrices[modifier | modifier le wikicode]

/* ------------------------------------ */
#include "v_a.h"
/* ------------------------------------ */
int main(void)
{
time_t t;

  srand(time(&t));

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

double **A = r_mR(i_mR(r,c),9);
double **B = r_mR(i_mR(r,c),9);
double **AplsB = i_mR(r,c);


  printf(" A : ");
  p_mR(A,3,0,C6);

  printf(" B : ");
  p_mR(B,3,0,C6);

  printf(" AplsB : ");
  p_mR(add_mR(A,B,AplsB),3,0,C6);

  f_mR(A);
  f_mR(B);
  f_mR(AplsB);

  getchar();

  return 0;
}


À faire :

  • Essayer de lire ce code comme pour l'exemple ci-dessus.
  • On commence par l'intérieur.
  • r_ pour rand.
  • p_ pour print.
  • i_ pour initialize.
  • f_ pour free.


La fonction f_mR();[modifier | modifier le wikicode]

  • Nous allons commencer par cette fonction.
  • Elle libère l'espace alloué à la matrice par la fonction i_mR();


Code source[modifier | modifier le wikicode]

/* ------------------------------------ */ 
void f_mR(
double **A
)
{
  if(A)  free(A[0]);

  free(A);
}


  • Nous travaillons avec des double pointeurs (**A).
  • Il y a deux pointeurs dans la fonction. (A,A[0])
  • C'est un bon début.
  • On commence par vérifier que "A" n’est pas NULL.
  • Si tout va bien on libère "A[0]" le deuxième pointeur.
  • Puis on libère A.
  • Si "A" n'existe pas, on saute "A[0]", mais on libère "A".
  • Peut-être aurait-il mieux valu écrire


/* ------------------------------------ */ 
void f_mR(
double **A
)
{
  if(A){ 
    free(A[0]);
    free(A);
       }
}


Ceci termine notre premier pas sur les double pointeurs.