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 :

Comportement étrange d'un tableau d'enregistrements


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Comportement étrange d'un tableau d'enregistrements
    Bonjour,

    Voilà plusieurs jours que je me tire les cheveux. Malgré plusieurs essais avec des IDE différents sur des plateformes différentes (Linux/W7 en 32/64 bits), j'ai un tableau d'enregistrements (ou de structure : tout dépens du langage que l'on utilise pour s'exprimer ) au comportement étrange. Son nom est sAnimal. Il contient divers champs. J'ai créé un tableau du type de cette structure. Ce tableau nommé "animaux" réinitialise les champs "l" et "identifiant" à zéro du premier élément du tableau (animaux[0].l et animaux[0].identifiant) dans le sous-programme tour_de_jeu sans que je lui demande...

    Plutôt que de faire un grand discours, je vous présente des bouts de codes incriminés avec les "printf" qui affichent les champs se réinitialiser en commentaire dans le code.
    Merci d'avance

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    #define L_ANIMAL 20
    #define L_CARTE 50
    #define C_CARTE 50
     
    struct animal
    {
        int identifiant;//animal : de 1 à 20
        int l;
        int c; // x:ligne, y:colonne
        int boire;//boire : 3 jours max pour boire
        int manger; //manger : 10 jours max pour manger
    };
    typedef struct animal sAnimal;
     
    ...
     
    void conception_tab_animal(int plateau[L_CARTE][C_CARTE],sAnimal animaux[L_ANIMAL],int nb_animal,int l_carte,int c_carte)
    {
        int i,l,c;
        int identifiant_anim=IDENTIFIANT_ANIMAL; //identifiant animal : de 1 à 20
        int boire=QUANTITE_INI_ANIMAL_BOIRE;
        int manger=QUANTITE_INI_ANIMAL_MANGER;
     
        for(i=0; i<nb_animal; i++)
        {
            animaux[i].identifiant= identifiant_anim;
            animaux[i].boire= boire;
            animaux[i].manger=manger;
            do
            {
                l=calc_coord_l(l_carte);
                c=calc_coord_c(c_carte);
    	printf("l=calc_coord_l=%d, c=calc_coord_c=%d",l,c); // coordonnees variant de 0 à 19
           getchar();
            }
            while(plateau[l][c]!=0);
     
            animaux[i].l=l;
            animaux[i].c=c;
     
            printf("\ni=%d \t conception tab animalidentifiant animal = %d, l=%d, c=%d ",i,animaux[i].identifiant,animaux[i].l,animaux[i].c); // tous les champs sont bon
     
             getchar();
            plateau[l][c]=identifiant_anim;
     
            identifiant_anim++;
        }
        return;
     
    }
     
    void tour_de_jeu(int plateau[L_CARTE][C_CARTE], int l_carte, int c_carte, sAnimal animaux[L_ANIMAL], int *nb_animal, sEau tab_eau[L_EAU], int *nb_eo, sHerbe tab_herbe[L_HERBE], int *nb_herb, int id_zero_tab_animaux, int l_tab_animaux, int id_tab_eau)
    {
    //renvoi 0:rien, 1:animal, 2:eau, 3:herbe 10:depassement tableau
     
        int i,j,id_case;
        int deplacement_oui_ou_non;//0:impossible 1:possible
        int direction;
        int nb_deplacement;
        int position_dans_tab_animaux;
        int nb_tentative_changement_direction=0;
     
       printf("\ntour de jeu dentifiant=%d animaux[0].l=%d animaux[0].c=%d\n",animaux[0].identifiant,animaux[0].l,animaux[0].c); // LA LES CHAMPS animaux[0].l et animaux[0].identifiant sont à ZERO alors que animaux[0].c est bon ?!!
    ...
     
     
     
    int main()
    {
        sAnimal animaux[L_ANIMAL];
     
    ...
        conception_tab_animal(plateau,animaux,nb_animal,l_carte,c_carte);
     
        for(i=0; i<nb_animal; i++)
        {
     
               printf("\nMAIN %d eme animal - identifiant=%d , l= %d, c=%d ",i,animaux[i].identifiant,animaux[i].l,animaux[i].c); // // tous les champs sont bon
             getchar(); //pour faire une pause
      }
    ....
      for(i=0; i<duree; i++)
        {
     
            affiche_plateau(plateau,l_carte,c_carte);
            printf("\nTOUR numero = %d ",i+1);
     
            tour_de_jeu(plateau,l_carte,c_carte,animaux,&nb_animal,tab_eau,&nb_eo,tab_herbe,&nb_herb,id_zero_tab_animaux,l_tab_animaux,id_tab_eau); //appel au s/prog tour_de_jeu et PAF dans ce s/prog LES CHAMPS animaux[0].l et animaux[0].identifiant sont à ZERO !!!
     
    }
    ...

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Tu as quelque chose, quelque part, qui déborde sur ton tableau.
    Le code limité que tu as posté (et qui n'est pas compilable, les fonctions calc_coord_l() et calc_coord_c() étant manquantes) ne me permet pas de déterminer où est le problème.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Voici les codes des fonctions demandées:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    int calc_coord_l(int l) //0 à 14
    {
        return rand()%l;//0 à 14
    }
    int calc_coord_c(int c) //0 à 14
    {
        return rand()%c;//0 à 14
    }
    Je teste le contenu du tableau d'enregistrement animaux après l'avoir rempli les champs "l" et "c" de nombres aléatoires (c'est-à-dire après l'appel des fonctions calc_coord_l(int l) et calc_coord_c(int c)) directement dans le s/programme "conception_tab_animal" (voir ligne 34 et ligne 42 de mon premier post). Là aucun problème.
    Ce que je ne comprends pas :
    Je ne touche plus ensuite au contenu des champs "l" et "identifiant" dans le tableau animaux (pour le moment il n'y a qu'un seul animal car je suis en phase de débogage). Je teste encore le contenu de ces champs dans le programme principal "main" (ligne 79). Là aussi, il n'y a aucun problème.
    Depuis le "main", je passe en paramètre le tableau animaux au s/programme tour_de_jeu (ligne 89). Je teste à nouveau le contenu de ces champs dans ce s/programme (ligne 64) et là le contenu des champs "l" et "identifiant" sont mis à zéro...tandis que celui de "c" reste inchangé...

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    en général pour débuguer un programme il est plus simple d'utiliser un debuger plutôt qu'un forum
    Sinon un bon outil pour t'aider à trouver rapidement les endroits fautifs est valgrind, un memory profiler.

    As-tu essayé ?

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2012
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci de vos réponses.
    Ok pour Valgrind, je n'y avais pas pensé. Je n'ai rien découvert de probant ...pour finalement me rendre compte qu'un compilateur GCC natif linux + emacs génèrent beaucoup d'embêtements qu'un IDE fonctionnant sous une VM (Virtual Machine) Windows...
    J'hallucine : le même code fonctionne parfaitement sous Linux natif (c'est à dire pas dans une VM ) mais bogue sous une VM Windows avec un IDE
    Conclusion: pour du développement et surtout pour éviter de perdre un temps fou...éviter de développer du code sous des machines virtuelles !

  6. #6
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Attention, un code qui semble fonctionner n'est pas forcément un code correct.

    En règle générale, si la sortie valgrind n'est pas vierge c'est qu'il y a des conneries, s'il y a des conneries genre undefined behaviour alors tout peut arriver … ça fonctionne … ou pas … ou parfois …

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/10/2009, 20h26
  2. Comportement étrange pour des ComboBox dans un tableau
    Par Shaaay dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/04/2008, 17h28
  3. comportement étrange d'une jointure ...
    Par amenis dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 10/02/2005, 21h27
  4. [Système][Runtime][Exec] Comportement étrange au lancement de BeSweet
    Par divxdede dans le forum API standards et tierces
    Réponses: 1
    Dernier message: 06/06/2004, 09h54
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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