IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Tableau dynamique de type crée dans une structure


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Points : 11
    Points
    11
    Par défaut Tableau dynamique de type crée dans une structure
    Bonjour à tous et déjà merci pour votre aide.

    J'aimerai allouer un tableau de type "info" via une fonction mais ça ne marche pas, je met le bout de code qui plante :

    le .h :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    typedef struct info
    {
        int frame, ctr;
        SDL_Rect delim;
    }info;
     
    typedef struct animE
    {
        info *joueur;
        info *fleur, *mage;
    }animE;
     
    void initAnim(char emplacementFichier[], info anim[]);
    void initAnimD(void);
    et le .c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
     
    animE anim;
     
    void initAnimD(void)
    {
        initAnim("Ressource/Anim/Hero.anim", anim.joueur);
     
     
    }
     
    void initAnim(char emplacementFichier[], info anim[])
    {
     
        FILE *animF = NULL;
        int nombreAnim = 0, i;
     
        animF = fopen(emplacementFichier, "r");
        fscanf (animF, "%d\n", &nombreAnim);
     
        anim = malloc(nombreAnim*sizeof(info));
     
        for (i=0; i<nombreAnim;i++)
        {
     
            fscanf (animF, "%d,%d,%d,%d,%d,%d\n",&anim[i].frame,&anim[i].ctr
                                                ,&anim[i].delim.x, &anim[i].delim.y
                                                ,&anim[i].delim.w, &anim[i].delim.h);
        }
     
        fclose (animF);
     
     
    }
    Donc la fonction "initAnimD" est appelée dans le main et demande, depuis un fichier .anim, de remplir un tableau qui gère les animations (ici pour le héros, mais le but est de pouvoir remplir d'autre tableau comme pour les monstres juste en appelant la fonction "initAnim").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    initAnim("Ressource/Anim/Hero.anim", anim.joueur); // Envoi le tableau joueur
    initAnim("Ressource/Anim/Mage.anim", anim.mage); // Envoi le tableau mage (un monstre)

    Donc tant que je suis dans la fonction : "initAnim" je peut avoir accès aux valeurs stockées dans le tableau, avec un printf par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf ("%d\n", anim[1].ctr);
    Mais une fois de retour dans la fonction "initAnimD" je n'ai plus accès au tableau joueur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void initAnimD(void)
    {
        initAnim("Ressource/Anim/Hero.anim", anim.joueur);
        printf ("%d\n", anim.joueur[1].ctr); // Ici le programme plante
     
     
    }
    J'en conclus que le tableau est mal alloué mais je ne sais pas quoi faire pour régler le problème.

    Merci.

  2. #2
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    Ton codes est sources de grosses erreurs !!!

    avoir un seul nom de variable pour 2 données différentes, ca n'aide pas à la compréhension (j'ai failli te donner de fausses pistes à cause de ca):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    animE anim;
    void initAnim(char emplacementFichier[], info anim[])
    pour savoir combien de joueurs ont été lus dans ton fichier je te conseille de traces le résultat de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fscanf (animF, "%d\n", &nombreAnim);

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Ouai tu as raison pour les noms de variables je vais les changer.

    Sinon la lecture du fichier et l'écriture dans le tableau (les valeurs sont exactes) marche impec tant que je suis dans "initAnim" mais une fois de retour dans "initAnimD" je ne peut plus avoir accès aux valeurs.

  4. #4
    Expert confirmé Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Points : 5 382
    Points
    5 382
    Par défaut
    tu as un problème de passage de paramètre, il faut passer le pointeur sur ton tableau.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initAnim(char emplacementFichier[], info *anim[]);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    initAnim("Ressource/Anim/Hero.anim", &anim.joueur); // Envoi le tableau joueur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void initAnim(char emplacementFichier[], info *anim[])
    {
     
        FILE *animF = NULL;
        int nombreAnim = 0, i;
     
        animF = fopen(emplacementFichier, "r");
        fscanf (animF, "%d\n", &nombreAnim);
     
        *anim = malloc(nombreAnim*sizeof(info));
    ....

  5. #5
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2011
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Désolé pour le temps de réponse.

    Mais sinon j'avais essayé ce que tu me propose mais rien à faire ça ne marchait toujours pas.
    Du coup j'utilise return pour renvoyer le tableau et tout marche.

    en tout cas merci de ton aide

Discussions similaires

  1. Réponses: 7
    Dernier message: 17/01/2012, 18h01
  2. Réponses: 4
    Dernier message: 22/12/2011, 17h54
  3. Réponses: 11
    Dernier message: 09/02/2010, 12h42
  4. parcourir un tableau dynamique dans une structure
    Par brunolekid dans le forum C
    Réponses: 4
    Dernier message: 23/10/2009, 16h24
  5. type void* dans une structure
    Par barbapapaz dans le forum C
    Réponses: 3
    Dernier message: 16/07/2004, 17h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo