Signaler

Les strucutures de tableau en C win [Résolu]

Posez votre question poparnassus 403Messages postés vendredi 28 mars 2014Date d'inscription 17 août 2017 Dernière intervention - Dernière réponse le 6 mars 2017 à 17:07 par SanzenSekai
Bonjour,

Je me suis aperçu que je ne maîtrisai pas les tableaux, donc petit exercice je code le fameux jeux SNACK.

J'ai besoin d'un tableau de dimension "n" où "n" represente le nombre de block du serpent et donc pour chaque valeur de block_n[i] je dois avoir x et y. ( position du point i={x,y} )

typedef struct SNACKE SNACKE;
struct SNACKE
{
    int snack_speed;
    int block_n[2]; //x et y
    int nb_block;
};

void init_jeux(FENETRE *ecran,SNACKE *snacke,JEUX *jeux)
{
    //init snacke
    snacke->nb_block= 1;
    snacke->snack_speed = 1;
    //Position de depart du serpent
    snacke->block_n[0]=jeux->Rlevel_1.w/2;
    snacke->block_n[1]=jeux->Rlevel_1.h/2;
}

main()
{
     SNACKE snacke;

     init_jeux(&snacke);

     while(quit)
     {
       //Mon programme
     }
}


Du coup je veux que ma structure "snacke" soit un tableau
Comment on déclare une structure de tableau ?
je défini la taille de mon serpent soit "int nb_block" dans ma structure mais je crois que je ne le fais pas au bon endroit car je veux que "nb_block" soit la taille de mon tableau de structure.

merci
Afficher la suite 
Utile
+0
plus moins
int block_n[2]; fait un tableau de int,
struct SNACKE snake[100]; fera un tableau de taille 100 avec ta structure a chaque cellule.
Mais je ne comprend pas ce que tu veux dire quand tu parles de structure de tableau...
Tu pourrais être plus clair ?
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 4 mars 2017 à 23:02
Oui c'est ça, en fait si tu fais SNACKE snacke[100] tu as un tableau pouvant contenir 100 SNACKE donc à chaque cellule du tableau tu auras une struct SNACKE contenant une position_n, une snack_speed et un int block_n, ce qui n'est pas très pertinent car ton serpent n'a qu'une vitesse et le nombre de black le composant sera le même sur chaque celulle. De plus pour modifier le nombre de block tu devras le modifier sur chaque cellule du tableau ce qui n'est pas pertinent non plus...
Répondre
poparnassus 403Messages postés vendredi 28 mars 2014Date d'inscription 17 août 2017 Dernière intervention - 4 mars 2017 à 23:05
Par contre la taille est variable du coup je veux que le [n] soit une variable

J'ai essayer ceci
int nb_block = 1;
typedef struct SNACKE SNACKE;
struct position_n
{
    int x;
    int y;
};

struct SNACKE
{
    //position_n block[100];
    int snack_speed;
    //int block_n;
    struct position_n position_n[nb_block];
};


error: variably modified 'position_n' at file scope|
Répondre
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 4 mars 2017 à 23:10
Tu ne peux pas modifier la taille d'un tableau, une fois créé sa taille est fixe! De plus tu ne peux pas mettre de variable comme taille, car à la compilation le compilateur ne sait quelle taille fera ton tableau. Tu peux par exemple faire un tableau arbitrairement grand (100 par exemple) ou alors créer ton propre module de liste, avec des pointeurs, afin d'agrandir ou réduire la liste de manière dynamique
Répondre
poparnassus 403Messages postés vendredi 28 mars 2014Date d'inscription 17 août 2017 Dernière intervention - 4 mars 2017 à 23:28
Par contre dans mes fonction comment je passe ma structure snacke en argument parce que j'ai un warning
|warning: passing argument 2 of 'init_jeux' from incompatible pointer type|

typedef struct SNACKE SNACKE;
struct position_n
{
    int x;
    int y;
};

struct SNACKE
{
    //position_n block[100];
    int snack_speed;
    int nb_block ;
    struct position_n position_n[100];
};

void init_jeux(FENETRE *ecran,SNACKE *snacke,JEUX *jeux)
{
    //init snacke
    snacke->nb_block= 1;
    snacke->snack_speed = 1;
    snacke->position_n[0].x = jeux->Rlevel_1.w/2;
    snacke->position_n[0].y = jeux->Rlevel_1.h/2;
}
main()
{

SNACKE snacke[100];

init_jeux(&ecran,&snacke,&jeux);

    while(!event.quitter)
    {
        updateEvent(&event);

        jeuxGestion(&ecran,&snacke,&jeux,&event); //Gestion du jeux
}
Répondre
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 4 mars 2017 à 23:43
Ta fonction init_jeux demande en deuxième paramètre un SNACKE *, soit un pointeur sur struct SNACKE. Ici ta variable snacke est de type SNACK[], soit struct SNACKE [].

Si tu déréférences snacke tu obtiens SNACKE * [] alors que la fonction attend un SNACKE *, d'où ton erreur "incompatible pointer type"

Pour faire simple, ta fonction attends un pointeur sur une struct SNACK et toi tu lui passes un pointeur sur un tableau de struct SNACK
Répondre
Donnez votre avis
Utile
+0
plus moins
Si tu veux faire des tableaux a taille "variable" tu peux utiliser la fonction malloc.
Par exemple si tu as une fonction qui prend en paramètre un int "taille" et que tu veux créer un tableau de taille éléments tu fais quelque chose comme ;

void machin (int taille) {
SNACKE * snake ;
snake = malloc (taille * sizeof (SNACKE)) ;
}

Tu peux alors utiliser snake plus ou moins comme si tu avais fait
SNACKE snacke[taille];

Par contre une fois que tu a fais appel a malloc tu ne peux toujours pas modifier la taille de ton tableau, si tu veux quelque chose de vraiment variable il te faut faire une liste comme dit plus haut.

Et lorsque que tu a fini d'utiliser ton tableau tu dois faire appel a la fonction free.
Dans mon exemple tu dois écrire ;
free (snake) ;
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 5 mars 2017 à 14:29
La flèche ne sert qu'à faire un raccourci syntaxique!

Ce n'est pas en fonction du main ou de la fonction à utiliser, mais en fonction de la struct que tu utilises.

(struct*).data est équivalent à struct->data
Répondre
poparnassus 403Messages postés vendredi 28 mars 2014Date d'inscription 17 août 2017 Dernière intervention - 6 mars 2017 à 13:51
J'ai quand même du mal a comprendre, je reprends l'exemple ci dessus mais en inversant le. et le "->" , donc pourquoi si je fais ceci ca ne compile pas:

typedef struct EVENEMENT EVENEMENT;
struct EVENEMENT
{
    int quitter ;
};

typedef struct JEUX JEUX;
struct JEUX
{
    int game_start;
    int game_pause ;
};


//Dans mon MAIN     
if(jeux->game_pause == 1) //error: invalid type argument of '->' (have 'EVENEMENT')|
        {
            system("PAUSE");
        }

//Dans une fonction VOID
if(jeux.game_start == 1)  //error: request for member 'game_start' in something not a structure or union|
{
}


Ou es que la cause est que mes structure sont déclarer dans mon main?
Répondre
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 6 mars 2017 à 16:43
Comme dit plus haut la flèche n'est qu'un raccourci syntaxique.

(struct *).data est équivalent à struct->data

Ta première erreur vient du fait que tu as une struct EVENEMENT et non pas un pointeur sur une struct EVENEMENT.

Pour la seconde je dirai que tu passes jeux en paramètre sous forme de pointeur, et donc jeux est un pointeur sur struct JEUX et non pas une struct JEUX directement.
Répondre
poparnassus 403Messages postés vendredi 28 mars 2014Date d'inscription 17 août 2017 Dernière intervention - 6 mars 2017 à 16:54
ah okkkk j'ai compris, je te remercie.
Répondre
SanzenSekai 10Messages postés samedi 4 mars 2017Date d'inscription 6 mars 2017 Dernière intervention - 6 mars 2017 à 17:07
Pas de soucis, n'hésites pas si tu as encore besoin d'aide!
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !