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
| #include <stdlib.h>
#include <stdio.h>
#ifdef _DEBUG
#define DBG_PRINTF(a) printf a
#else
#define DBG_PRINTF(a)
#endif
/* Autre fonction d'allocation
--------------------------- */
double ** AutreAllocTable2D(
size_t taille1, /*[in] Nb de lignes */
size_t taille2 /*[in] Nb de valeurs par ligne */
)
{
double ** ppValeurs;
size_t const taille1x2 = taille1*taille2;
if(taille1x2 / taille2 != taille1)
return NULL; /*Débordement des tailles*/
DBG_PRINTF((" Allocation d'un tableau de %lu pointeurs...\n", (unsigned long)taille1));
ppValeurs = malloc(sizeof(*ppValeurs)*taille1);
if(ppValeurs != NULL)
{
double * pValeurs;
DBG_PRINTF((" Allocation d'un tableau de %lu*%lu=%lu valeurs...\n",
(unsigned long)taille1, (unsigned long)taille2, (unsigned long)taille1x2
));
pValeurs = malloc(sizeof(*pValeurs)*taille1x2);
if(pValeurs != NULL)
{
size_t i;
/* Affecter tous les pointeurs */
DBG_PRINTF((" Affectation des pointeurs...\n"));
for(i=0 ; i<taille1 ; ++i)
ppValeurs[i] = pValeurs + (i*taille2);
}
else
{
/* Echec de la seconde allocation, liberer la premiere */
DBG_PRINTF((" Echec de la seconde allocation.\n"));
free(ppValeurs), ppValeurs=NULL;
}
}/*if*/
return ppValeurs;
}
/* Autre fonction de destruction
----------------------------- */
void AutreFreeTable2D(double **ppValeurs)
{
if(ppValeurs != NULL)
{
free(ppValeurs[0]);
free(ppValeurs);
}
}
/* Fonction de test
---------------- */
void TestArrayC(void)
{
void const *pvPrintf;
size_t const taille1 = 4200, taille2 = 14400;
double **ppValeurs1;
double **ppValeurs2;
puts("Allocation...");
ppValeurs1 = AllocTable2D(taille1, taille2);
pvPrintf = ppValeurs1;
printf("ppValeurs1 = %p\n", pvPrintf);
puts("Destruction...");
FreeTable2D(ppValeurs1, taille1), ppValeurs1=NULL;
puts("Allocation...");
ppValeurs2 = AutreAllocTable2D(taille1, taille2);
pvPrintf = ppValeurs2;
printf("ppValeurs2 = %p\n", pvPrintf);
puts("Destruction...");
AutreFreeTable2D(ppValeurs2), ppValeurs2=NULL;
} |
Partager