1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
   |  
#include <stdlib.h>
#include <stdio.h>
 
/* 0 | 1 */
#define DBG 0
 
#if DBG
static void display_line (char const *s, int* p, int nb_col)
{
   int j;
 
   printf ("%s: ", s);
   for (j = 0; j < nb_col; j++)
   {
      printf ("%-3d", p[j]);
   }
   printf ("\n");
}
#endif
 
/* Fonction de comparaison pour qsort() */
static int compare (void const *a, void const *b)
{
   /* -ed-
      Le tableau a trier a des elements de type int *
      On recoit l'adresse de l'element de type int*, soit int **
   */
   int const **ppa = a;
   int const **ppb = b;
 
   /* -ed- on recupere l'adresse de la ligne  */
   int const *pa = *ppa;
   int const *pb = *ppb;
 
#if DBG
 
   display_line("pa", pa, 2);
   display_line("pb", pb, 2);
#endif
 
   /* -ed- on teste la colonne 1 */
   return pa[1] - pb[1];
}
 
/* -ed- creation dynamique du tableau */
static int** create(int nb_lin, int nb_col)
{
   int **pp = malloc (sizeof * pp * nb_lin);
 
   if (pp != NULL)
   {
      int i;
      for (i = 0; i < nb_lin; i++)
      {
         pp[i] = malloc (sizeof * pp[i] * nb_col);
      }
   }
   return pp;
}
 
/* -ed- creation dynamique du tableau */
static void delete(int**pp, int nb_lin)
{
   if (pp != NULL)
   {
      int i;
      for (i = 0; i < nb_lin; i++)
      {
         free (pp[i]), pp[i] = NULL;
      }
   }
   free (pp), pp = NULL;
}
 
static void display (int** pp, int nb_lin, int nb_col)
{
   int i;
   for (i = 0; i < nb_lin; i++)
   {
      int j;
      for (j = 0; j < nb_col; j++)
      {
         printf ("%3d", pp[i][j]);
      }
      printf ("\n");
   }
}
 
int main (void)
{
   int nb_lin = 4;
   int nb_col = 2;
   int** tab2D = create (nb_lin, nb_col);
 
   tab2D[0][0] = 10 ;
   tab2D[0][1] = 15;
 
   tab2D[1][0] = 2 ;
   tab2D[1][1] = 6;
 
   tab2D[2][0] = 9 ;
   tab2D[2][1] = 18;
 
   tab2D[3][0] = 5 ;
   tab2D[3][1] = 5;
 
   display (tab2D, nb_lin, nb_col);
 
   // Appel de la fonction de tri
   {
      /* -ed- verifier que l'on passe les bons parametres */
      size_t nb_membres = nb_lin;
      size_t sz_membre = sizeof * tab2D;
      printf ("nb = %u sz = %u\n", (unsigned) nb_membres , (unsigned) sz_membre);
 
      qsort (tab2D, nb_membres , sz_membre, compare);
   }
 
   display (tab2D, nb_lin, nb_col);
 
   delete (tab2D, nb_lin);
 
   return 0;
} | 
Partager