[Langage C] Tableau statique et mémoire
Stonhenge
-
Stonehenge -
Stonehenge -
Bonjour,
J'ai quelques problèmes avec les tableaux en C.
Dans un exercice nous devons créer un tableau de 8x8, et devons pouvoir intéragir dessus.
Voici un exemple de code :
Bien entendu, cela ne fonctionne pas. Je peux très bien le faire marcher en passant le pointeur en paramètre pour l'affichage, en ayant dans l'initialisation faire un malloc(sizeof(grille)),
mais le problème c'est que les structures et les en-tête de fonctions sont imposées !
Donc je ne vois pas comment faire, l'affichage présente des caractère bizarres. Bref rien de ce qu'il devrait afficher :
? ?
? x ? ? ^ ? ?
? 3 G h
' ? ? ? ? ?
? B ? ) 7 ?
' ? ? l
X ? ? I
@ y ?
Une partie semble aléatoire, mais quelques caractères reviennent.
Je sollicite donc votre aide pour une solution car cela me bloque totalement. Une fois ceci expliqué la suite ne me posera plus de problème.
Merci d'avance à ceux qui répondront !
J'ai quelques problèmes avec les tableaux en C.
Dans un exercice nous devons créer un tableau de 8x8, et devons pouvoir intéragir dessus.
Voici un exemple de code :
typedef char grille[8][8]; grille* init_grille(){ //doit créer une grille remplie de '-' et renvoyer un pointeur sur cette grille nouvellement créée grille g; for (i=0;i<8;i++) for(j=0;j<8;j++) g[i][j] = '-'; return *g; void afficher_grille(grille g){ //doit afficher la grille for (i = 0; i < 8; i++) for(j=0;j<8;j++) fprintf(stderr, "%c ", g[i][j]); }
Bien entendu, cela ne fonctionne pas. Je peux très bien le faire marcher en passant le pointeur en paramètre pour l'affichage, en ayant dans l'initialisation faire un malloc(sizeof(grille)),
mais le problème c'est que les structures et les en-tête de fonctions sont imposées !
Donc je ne vois pas comment faire, l'affichage présente des caractère bizarres. Bref rien de ce qu'il devrait afficher :
? ?
? x ? ? ^ ? ?
? 3 G h
' ? ? ? ? ?
? B ? ) 7 ?
' ? ? l
X ? ? I
@ y ?
Une partie semble aléatoire, mais quelques caractères reviennent.
Je sollicite donc votre aide pour une solution car cela me bloque totalement. Une fois ceci expliqué la suite ne me posera plus de problème.
Merci d'avance à ceux qui répondront !
A voir également:
- [Langage C] Tableau statique et mémoire
- Tableau word - Guide
- Mémoire vive - Guide
- Langage ascii - Guide
- Trier un tableau excel - Guide
- RAM : type, format, CAS, vitesse, tout sur la mémoire vive - Guide
2 réponses
Ta valeur de retour est incompatible avec ton prototype de fonction.
Tu dois renvoyer une variable de type grille* et tu renvoies *g. En plus *g pointe sur n'importe quoi. Ca aurait pu planter d'ailleurs. Ton compilateur aurait même dû hurler ^^.
Définis plutôt ta variable en : grille *g = malloc(sizeof grille);
Et renvoie : return g;
Et dans ta fonction remplace g[i][j] par (*g)[i][j]
Le type sera cohérent avec le prototype de fonction.
Ca devrait mieux marcher.
Tu dois renvoyer une variable de type grille* et tu renvoies *g. En plus *g pointe sur n'importe quoi. Ca aurait pu planter d'ailleurs. Ton compilateur aurait même dû hurler ^^.
Définis plutôt ta variable en : grille *g = malloc(sizeof grille);
Et renvoie : return g;
Et dans ta fonction remplace g[i][j] par (*g)[i][j]
Le type sera cohérent avec le prototype de fonction.
Ca devrait mieux marcher.
Tout d'abord merci fiddy de ta réponse.
La méthode que tu préconise fonctionne, donc merci.
Maintenant toutes les fonctions que j'avais écrites sans tester roulent !
Sauf une, qui fait intervenir une structure.
La structure imposée est
avec typedef char coup[3];
(avant tout, en remplaçant "coup coups[]" par "coup * coups", tout fonctionne mais ça ne respecte pas la consigne)
La fonction qui pose probleme est celle-ci (elle a été remaniée pour tetner de résoudre le probleme, normalement elle est moins étalée). Elle me renvoie sur l'avant-dernière ligne, "utilisation invalide d'un membre flexible de tableau" !!
Sachant que test(grille g, coup c) fonctionne très bien, pourquoi me dit-il ça ? Je ne comprends même pas ce que signifie ce code erreur !
Et vu que la liste des possibilités est de taille variable, pourquoi nous faire utiliser coup[] plutôt que *coup ? Un tableau dynamique se fait avec pointeur, non ?
Merci d'avance d'une réponse claire
La méthode que tu préconise fonctionne, donc merci.
Maintenant toutes les fonctions que j'avais écrites sans tester roulent !
Sauf une, qui fait intervenir une structure.
La structure imposée est
typedef struct { int nb; coup coups[]; } sqc;
avec typedef char coup[3];
(avant tout, en remplaçant "coup coups[]" par "coup * coups", tout fonctionne mais ça ne respecte pas la consigne)
La fonction qui pose probleme est celle-ci (elle a été remaniée pour tetner de résoudre le probleme, normalement elle est moins étalée). Elle me renvoie sur l'avant-dernière ligne, "utilisation invalide d'un membre flexible de tableau" !!
sqc possibilités(grille g, char p){ //renvoi la séquence des possibilités qu'a p pour jouer sqc * res = malloc(sizeof(sqc); res->nb = 0; coup c; c[0]=p coup * tabc; int i,j; for(i=0;i<8;i++) for(j=0;j<8;j++){ c[1]=i; c[2]=j; if(test(g,c)){ res->nb++; //si c'est le 1er cas, on crée le tableau, sinon on l'agrandit if(res->nbcoups == 1) tabc = malloc(sizeof(coup)); else tabc = realloc(tabc, sizeof(coup)*res->nb); //tabc[res ->nb -1] = c ne fonctionne pas : incompatible type when assigning to type coup from type char * ?! où est défini le char * ? coup = char[3] !! On doit donc faire ça : tabc[res->nb - 1][0] = c[0]; tabc[res->nb - 1][1] = c[1]; tabc[res->nb - 1][2] = c[2]; } } res->coups = tabc; return *res;
Sachant que test(grille g, coup c) fonctionne très bien, pourquoi me dit-il ça ? Je ne comprends même pas ce que signifie ce code erreur !
Et vu que la liste des possibilités est de taille variable, pourquoi nous faire utiliser coup[] plutôt que *coup ? Un tableau dynamique se fait avec pointeur, non ?
Merci d'avance d'une réponse claire