[Langage C] Tableau statique et mémoire

Fermé
Stonhenge - 25 avril 2012 à 00:52
 Stonehenge - 26 avril 2012 à 13:10
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 :

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 !



2 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 814
25 avril 2012 à 01:07
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.
0
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
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
0