En fait, les vrais tableaux multidimensionnels sont difficile à utiliser dans une fonction parce qu'on doit spécifier très exactement leurs dimensions (sauf une, ce qui fait les tableaux unidimensionnels simples à utiliser).
Par exemple :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdlib.h>
void creerUneGrille(int (**grilleMap)[3]) // le '3' est obligatoire
{
*grilleMap=malloc(4*sizeof ** grilleMap);
if (*grilleMap != NULL)
{
(*grilleMap)[1][2] = 123;
}
}
int main(void)
{
int (*grille)[3]=NULL; // le '3' est obligatoire
creerUneGrille(&grille);
if(grille != NULL) grille[2][1] = 456;
return 0;
} |
ou encore :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| #include <stdlib.h>
int (*creerUneGrille())[3]
{
int (*grilleMap)[3];
grilleMap=malloc(4*sizeof * grilleMap);
if (grilleMap != NULL)
{
grilleMap[1][2] = 123;
}
return grilleMap;
}
int main(void)
{
int (*grille)[3]= creerUneGrille();
if(grille != NULL) grille[2][1] = 456;
return 0;
} |
void creerUneGrille(int ***grilleMap)
Dans notre cas, ceci suppose que grilleMap est l'adresse d'un tableau de int**. *grilleMap est donc un int** autrement dit, dans notre cas, l'adresse du début d'un tableau de pointeurs int*
En fait, tu veux construire un tableau (unidimensionnel) de pointeurs int* , chaque pointeur contenant l'adresse d'un tableau de int (représentant l'adresse de début d'une ligne du pseudo tableau 2D).
Ce n'est pas à proprement parler un tableau bidimensionnel mais ça se manipule ensuite exactement comme un tableau bidimensionnel. Comme on passe le tableau de pointeurs, tableau à une dimension, on évite le problème des dimensions.
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
| #include <stdlib.h>
void creerUneGrille(int *** grilleMap)
{
*grilleMap=malloc(4*sizeof(int *)); // le tableau de pointeurs
if (*grilleMap != NULL)
{
(*grilleMap)[0] = malloc(4*3*sizeof(int));// le tableau des données
if ((*grilleMap)[0] != NULL)
{ //initialiser les pointeurs sur chaque "ligne" du tableau des données
int i;
for(i =1; i<4;i++)(*grilleMap)[i]= (*grilleMap)[0] + i*3 ;
(*grilleMap)[1][2] = 123;
}
else
{ // erreur d'allocation : retourner NULL
free(*grilleMap);
*grilleMap = NULL;
}
}
}
int main(void)
{
int **grille ;
creerUneGrille(&grille);
if(grille != NULL) grille[2][1] = 456;
return 0;
} |
Ou en utilisant la valeur de retour de la fonction
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
| #include <stdlib.h>
int ** creerUneGrille(void)
{
int **grilleMap=malloc(4*sizeof(int *)); // le tableau de pointeurs
if (grilleMap != NULL)
{
grilleMap[0] = malloc(4*3*sizeof(int));// le tableau des données
if (grilleMap[0] != NULL)
{ //initialiser les pointeurs sur chaque "ligne" du tableau des données
int i;
for(i =1; i<4;i++)grilleMap[i]= grilleMap[0] + i*3 ;
grilleMap[1][2] = 123;
}
else
{ // erreur d'allocation : retourner NULL
free(grilleMap);
grilleMap = NULL;
}
}
return grilleMap;
}
int main(void)
{
int **grille = creerUneGrille();
if(grille!=0)grille[2][1] = 456;
return 0;
} |
Partager