Les strucutures de tableau en C win

Résolu/Fermé
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 - Modifié par poparnassus le 4/03/2017 à 21:36
SanzenSekai Messages postés 10 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 6 mars 2017 - 6 mars 2017 à 17:07
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

2 réponses

irevoire Messages postés 63 Date d'inscription jeudi 25 juillet 2013 Statut Membre Dernière intervention 5 mars 2017 14
4 mars 2017 à 21:14
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 ?
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié par poparnassus le 4/03/2017 à 22:42
Je pense que ce que j'ai dit n'a pas de sens, ce que je veux dans ma structure, c'est un tableau qui represente chaque bloque du serpend, et que chaque valeur du tableau pointe sur ma structure position

Du coup j'ai fait ceci

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

struct SNACKE
{
    int snack_speed;
    int block_n;
    struct position_n position_n;
};

void init_jeux(FENETRE *ecran,SNACKE *snacke,JEUX *jeux)
{

    //init snacke
    snacke->block_n= 1; //La taille du serpend
    snacke->snack_speed = 1; // La vitesse 
    snacke->position_n.x = jeux->Rlevel_1.w/2;
    snacke->position_n.y = jeux->Rlevel_1.h/2;
}

main()
{
   SNACKE snacke[100];

   init_jeux(&snacke); //j'ai un warning sur &snacke "invalid argument
}


Du coup:
        printf("SNACK X: %d\n",snacke[0].position_n.x);
printf("SNACK Y: %d\n",snacke[0].position_n.y);

M'affiche la valeur de
jeux->Rlevel_1.w/2
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
Modifié par poparnassus le 4/03/2017 à 22:50
Mais d'un point de vue fonctionnel, je ne sais pas si il vaut mieux mettre un tableau dans la structure position_n ou deux variables de types int ...

J'ai un warning sur toute mes fonction qui font appel a
(&snacke)
Ya un truc que je fais de travers ^^
0
SanzenSekai Messages postés 10 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 6 mars 2017 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
4 mars 2017 à 22:52
Je pense personnellement qu'il faut faire un tableau de position!

Si tu déclares ta structure de position comme étant juste un simple tableau alors ça ne sert à rien, tu encapsules juste ton tableau dans une structure ce qui est inutile!
0
SanzenSekai Messages postés 10 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 6 mars 2017 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
4 mars 2017 à 22:53
Bonjour! Ici tu peux remplacer ton struct position_n position_n; ligne 12 par struct position_n position_n[n];

Avec n un entier qui te permet ainsi de faire un tableau de longueur n qui pourra contenir tes positions!

Par contre la valeur est fixe, il faudra faire attention à ne pas dépasser la longueur du tableau au niveau des indices que tu utiliseras! Tu peux sinon faire ton tableau en utilisant les pointeurs (voire même créer ton propre module de tableau) mais cela te demandera plus de temps!
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
4 mars 2017 à 22:56
Le [n] correspondra au nombre de block de mon serpent en faite ?

Parce que comme j'ai fait ci dessus J'ai bien un tableau snacke[100] mais seulement 2 variable x et y alors qu'il me faut autant de variable x et y que de block_n
0
irevoire Messages postés 63 Date d'inscription jeudi 25 juillet 2013 Statut Membre Dernière intervention 5 mars 2017 14
5 mars 2017 à 01:39
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) ;
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
5 mars 2017 à 01:47
Si jutilise ta methode, je peux toujour utiliser free si la taille change, et redefinir la nouvel taille ?

Par contre vous voulez dire quoi en parlant de liste ?
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
5 mars 2017 à 09:50
En effet, si la taille du tableau doit changer on peut en créer un nouveau, copier dedans et libérer l'ancien (la fonction realloc() fait déjà tout cela).
On peut aussi utiliser une liste qui est moins contraignante à la réallocation mémoire mais a aussi beaucoup d'autres inconvénients (complexe à écrire, consomme plus de mémoire, risque d'effet 'gruyère', pas d'accès direct il faut parcourir la liste pour trouver le i-ème élément)
0
SanzenSekai Messages postés 10 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 6 mars 2017 > poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019
5 mars 2017 à 11:37
Les listes et les tableaux sont 2 moyens différents de stocker les données, avec leurs avantages et leurs inconvénients ^^
0
poparnassus Messages postés 426 Date d'inscription vendredi 28 mars 2014 Statut Membre Dernière intervention 25 décembre 2019 30
5 mars 2017 à 13:30
Ok Je vous remercie !
comment ca marche les listes ? Si vous avez un petit liens :-)
0
SanzenSekai Messages postés 10 Date d'inscription samedi 4 mars 2017 Statut Membre Dernière intervention 6 mars 2017
5 mars 2017 à 13:51
Tu peux te faire un module pour créer des listes simplement chaînée, elles te seront suffisantes pour ton projet!

J'ai trouvé ce lien qui les explique, rien de bien compliqué si tu maîtrises à peu près les pointeurs!

https://nicolasj.developpez.com/articles/listesimple/
0