Plusieurs choses à souligner.
Tout d'abord, vous ne pouvez pas assigner un objet tableau comme vous le faites ici :
char A[LARGEUR][HAUTEUR];
A=rand_grid(LARGEUR,HAUTEUR);
Les objets de type tableau ne sont pas modifiables.
Deuxièmement, les fonctions en C ne peuvent pas retourner des types de tableau. Ils peuvent cependant retourner des pointeurs vers des tableaux :
char (*foo(int largeur))[HAUTEUR]
{
/**
* allouer dynamiquement la mémoire pour un tableau largeur x HAUTEUR de char
*/
char (*newArr)[HAUTEUR] = malloc(sizeof *newArr * largeur);
/**
* initialiser le contenu du tableau ici
*/
return newArr;
}
La syntaxe est un peu déroutante; cela se lit comme
foo -- foo
foo(int largeur) -- est une fonction
-- prenant un paramètre entier
*foo(int largeur) -- retournant un pointeur
(*foo(int largeur))[HAUTEUR] -- vers un tableau de HAUTEUR éléments
char (*foo(int largeur))[HAUTEUR] -- de char
Pour C89, HAUTEUR dans le extrait ci-dessus doit être une expression intégrale constante au moment de la compilation (soit une macro, un littéral numérique, ou une expression arithmétique consistant en des macros et/ou des littéraux numériques). Je ne suis pas sûr si c'est aussi vrai pour C99.
Basé sur le extrait que vous avez posté, ce que vous voulez faire est de prendre un tableau que vous avez déjà alloué et d'initialiser ses contenus. N'oubliez pas que dans la plupart des contextes, une expression d'un type de tableau sera implicitement convertie en un pointeur vers le type de base. Autrement dit, si vous passez un tableau de N éléments de T à une fonction, ce que la fonction reçoit réellement est un pointeur vers T :
void foo (T *p) {...}
...
T arr[N];
foo(arr);
Pour les tableaux à 2 dimensions, c'est un peu plus compliqué :
void foo(T (*p)[M]) {...}
...
T arr[N][M];
foo(arr);
Cela repose également sur le fait que M soit connu au moment de la compilation, ce qui limite l'utilité de la fonction. Ce que vous aimeriez, c'est une fonction qui peut traiter un tableau à 2 dimensions de taille arbitraire. La meilleure façon que je connaisse pour y parvenir est au lieu de passer un pointeur vers le tableau, de passer l'adresse du premier élément dans le tableau[1], et de passer le nombre de lignes et de colonnes en tant que paramètres séparés :
void foo(T *base, size_t lignes, size_t colonnes) {...}
...
T arr[N][M];
foo (&arr[0][0], N, M);
Ainsi, votre fonction rand_grid ressemblerait à ceci :
void rand_grid(char *base, size_t lignes, size_t colonnes)
{
size_t i, j;
for (i = 0; i < lignes; i++)
{
for (j = 0; j < colonnes; j++)
{
/**
* Comme base est un simple char *, nous devons l'indexer
* comme s'il pointait vers un tableau 1D. Cela fonctionne si
* base pointe vers le premier élément d'un tableau 2D,
* car les tableaux multidimensionnels sont contigus.
*/
base[i*colonnes+j] = initial_value();
}
}
}
int main(void)
{
char A[LARGEUR][HAUTEUR];
rand_grid(&A[0][0], LARGEUR, HAUTEUR);
...
}
- Même si les expressions
&A[0][0]
et A
donnent la même valeur (l'adresse de base de A), les types des deux expressions sont différents. La première expression est évaluée comme un simple pointeur de char (char *
), tandis que la seconde est évaluée comme un pointeur vers un tableau 2D de char (char (*)[HAUTEUR]
).