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
| #include <stdio.h>
#include <stdlib.h>
/* Constuit un tableau 2D avec une allocation dynamique par dimension */
int **tableau2D_creer(size_t longueur, size_t largeur)
{
int **self = NULL;
if (longueur > 0 && largeur > 0)
{
/* 1ère allocation dynamique */
self = malloc(longueur * sizeof *self);
if (self != NULL)
{
/* 2ème allocation dynamique */
self[0] = malloc(longueur * largeur * sizeof *self[0]);
if (self[0] != NULL)
{
size_t i;
for (i = 1; i < longueur; ++i)
{
self[i] = &self[0][i * largeur];
}
/* Initialiser le tableau */
for (i = 0; i < longueur * largeur; ++i)
{
self[0][i] = 0;
}
}
else
{
/*La deuxième allocation a échoué: on libère la mémoire
allouée*/
free(self), self = NULL;
}
}
}
return self;
}
/* Détruit du tableau 2D */
void tableau2D_detruire(int ***self)
{
if (self != NULL && *self != NULL)
{
free(**self);
free(*self), *self = NULL;
}
}
/* Affiche le contenu du tableau 2D */
void tableau2D_afficher(int **self, size_t longueur, size_t largeur)
{
if (self != NULL && longueur > 0 && largeur > 0)
{
size_t i, j;
for (i = 0; i < longueur; ++i)
{
for (j = 0; j < largeur; ++j)
{
printf("%d ", self[i][j]);
}
printf("\n");
}
}
}
/* Exemple d'utilisation */
int main(void)
{
int err = EXIT_SUCCESS; /* code d'erreur */
size_t i, j; /* indices de boucle */
size_t dim_x = 3;
size_t dim_y = 5;
int **tableau = tableau2D_creer(dim_x, dim_y);
if (tableau != NULL) /* Allocation OK */
{
/* On place quelques valeurs dans notre tableau */
for (i = 0; i < dim_x; ++i)
{
for (j = 0; j < dim_y; ++j)
{
if (i != j)
{
tableau[i][j] = 10;
}
}
}
/* On affiche */
tableau2D_afficher(tableau, dim_x, dim_y);
/* Et bien sûr, on libère la mémoire */
tableau2D_detruire(&tableau);
}
else /* L'allocation a échoué */
{
fprintf(stderr, "Erreur d'allocation! Mémoire insuffisante...\n");
err = EXIT_FAILURE;
}
return err;
} |