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 :

Modification tableau de pointeurs au sein d'une structure


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut Modification tableau de pointeurs au sein d'une structure
    Bonjour,
    voici un soucis sur lequel je planche depuis à mon gout trop longtemps x]
    J'espère que vous pourrez me filer un coup de pouce

    ==> Je dispose d'une structure joueur que je désire "initialiser"
    => Aucun soucis pour rentrer les coordonnées du joueur qui sont "pos_x" et "pos_y".

    => BITMAP* marche[7] est censé contenir les 7 images correspondant au mouvement "marche" de mon personnage, mais je n'arrive pas à rentrer les images dans le tableau (pas de soucis à la compilation) et j'obtiens un beau segment_fault avec le code que voici:

    jeu.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
      #include <stdio.h>
    #include <allegro.h>
    #include <string.h>
    #include <stdlib.h> 
    #include "fenetre.h"
    #include "joueur.h"
     
    typedef struct _Joueur{
    char* name;
    double pos_x;
    double pos_y;
    BITMAP* marche[7];
    BITMAP* poing[9];
    BITMAP* saut[11];
    }Joueur, *pJoueur ;
     
    Joueur joueur1;
    joueur1.name="Silver"; 	
     
    joueur_init(&joueur1);
    joueur.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void joueur_init();
    joueur.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
     
    #include <stdio.h>
    #include <allegro.h>
    #include <string.h>
    #include <stdlib.h>
     
    typedef struct _Joueur{
    char* name;
    double pos_x;
    double pos_y;
    BITMAP* marche[7];
    BITMAP* poing[9];
    BITMAP* saut[11];
    }Joueur, *pJoueur ;
     
    void joueur_init(pJoueur J){
     
    J->pos_x=300;
    J->pos_y=300;
     
    J->marche[0]=load_bitmap("Perso1.bmp",NULL);
    }
    Merci d'avance pour votre aide

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Février 2007
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 107
    Points : 82
    Points
    82
    Par défaut
    bonjour

    voici quelques idées :

    dans le header vus avez :joueur_init(mettre un type)
    car la fonction est utilisé : joueur_init(&joueur1); void joueur_init(pJoueur J)
    et mettre un extern devant le prototype

    si j'ai bien compris:
    BITMAP* marche[7]; est peut etre a modifier
    marche[7] est un tableau se type BITMAP.
    il faut un pointeur de type BITMAP qui est initialisé &marche[0]
    est un pointeur sur un

    boon courage & bonne journée
    PY

  3. #3
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    1- C'est étonnant que jeu.c compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    joueur1.name="Silver"; 	
    joueur_init(&joueur1);
    est un code hors de toute fonction.

    2- Il ne faut pas dupliquer les définitions : les .h sont faits pour ça.

    3- void joueur_init();n'est pas un prototype. Un prototype de fonction DOIT avoir la déclaration des types des paramètres.

    4- Il est de bon ton pour un .c d'inclure le .h associé. Ceci permet de vérifier la cohérence des déclarations entre les deux.

    joueur.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <allegro.h>   // pour avoir la déclaration de BITMAP
    typedef struct _Joueur
    {
       char* name;
       double pos_x;
       double pos_y;
       BITMAP* marche[7];
       BITMAP* poing[9];
       BITMAP* saut[11];
    }Joueur ;   // *pJoueur :  ce n'est pas astucieux de cacher un pointeur dans un typedef
    void joueur_init(Joueur * joueur);
    joueur.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>   // si besoin dans joueur.c
    #include <string.h>  // si besoin dans joueur.c
    #include <stdlib.h>
    #include "joueur.h" 
    void joueur_init(Joueur* J)
    {
       if(J!=NULL)
       {   
          J->pos_x=300;
          J->pos_y=300;
          J->marche[0]=load_bitmap("Perso1.bmp",NULL);
       }
    }
    jeu.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <stdio.h>   // si besoin dans jeu.c
    #include <string.h>  // si besoin dans jeu.c
    #include <stdlib.h>  // si besoin dans jeu.c
    #include "fenetre.h" // si besoin dans jeu.c
    #include "joueur.h"
    int main(void) //par exemple
    { 
      Joueur joueur1;
      joueur1.name="Silver"; 	 
      joueur_init(&joueur1);
      return 0;
    }
    Publication : Concepts en C

    Mon avatar : Glenn Gould

    --------------------------------------------------------------------------
    Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 10
    Points : 11
    Points
    11
    Par défaut
    Merci diogene pour ton aide.
    Evidemment j'avais oublié le main() dans jeu.c

    J'ai effectué les modifications que tu as indiquées.
    Malheureusement toujours le même résultat, à savoir:

    => la modification J->pos_x est bien modifié
    => la modification J->marche[0]=load_bitmap("Perso1.bmp",NULL) semble provoquer un segment fault :/

    Pourtant l'adresse de l'image est correcte :/

    EDIT: En fait je faisais l'initialisation d'allegro ( fenêtres etc) après celle du joueur d'où le segment fault ... Une inversion et tout était réglé.
    Merci quand même pour vos réponses au moins les structures me paraissent plus clairs dorénavant =)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/03/2012, 11h12
  2. Réponses: 4
    Dernier message: 19/11/2011, 20h53
  3. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  4. pointeur de fonction dans une structure
    Par Flow_75 dans le forum C++
    Réponses: 1
    Dernier message: 27/12/2008, 11h55
  5. Réponses: 7
    Dernier message: 04/01/2006, 15h34

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