Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changement d'une valeur dans un sous programme

    21 mai 2018 à 20:37:26

    Bonjour,

    Je débute en C et travaille actuellement sur un projet d'informatique pour mon école. Cependant, je me heurte à un problème.

    J'ai créé une structure S_joueur et je souhaite modifier la valeur de "elimine" :

    struct player
    {
        char nom[LONGUEURNOM];
        int elimine;
    };
    typedef struct player S_joueur;

    Voilà à quoi ressemble le code que j'ai fait pour modifier cette valeur :

    void deplacement_pion(S_plateau *plateau,int ligne_d,int colonne_d,int ligne_a,int colonne_a,int tour_de_joueur,S_joueur *joueurs)
    {
        verification_mort_chef(plateau,plateau->type[ligne_a][colonne_a],plateau->joueur[ligne_d][colonne_d],plateau->joueur[ligne_a][colonne_a],&(joueurs[plateau->joueur[ligne_a][colonne_a]].elimine));
        ...
    }
    
    void verification_mort_chef(S_plateau* plat,int type_arrivee,int joueur_d,int joueur_chef_mort,int* joueur_elimine)
    {
        int i,j;
        if(type_arrivee==1)
        {
            for (i=0;i<DIMTAB;i++)
                for (j=0;j<DIMTAB;j++)
                    if(plat->joueur[i][j]==joueur_chef_mort)
                        plat->joueur[i][j]=joueur_d;
            *joueur_elimine=1;
        }
    }

    Je me doute que mon erreur est au niveau de l'envoi pour le int* joueur_elimine mais je n'arrive pas à la corriger (j'ai pas de mal de difficultés avec les pointeurs...).

    Lorsque j'affiche la valeur de "elimine" après le sous programme, celle ci est toujours de 0 (valeur à laquelle la variable a été initialisé) alors que ça devrait être 1.

    Merci pour votre aide ;)

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2018 à 20:59:00

      salut,

      es-tu sûr que cette expression

      &(joueurs[plateau->joueur[ligne_a][colonne_a]].elimine)

      te donne bien l'adresse souhaitée ? peut-être que l'index (qui est calculé avec d'autres index apparemment) te donne une mauvaise adresse (auquel cas ``*joueur_elimine=1; `` écrirais sur des octets qui ne sont pas ceux que tu veux. Une bonne manière de vérifier cela est d'utiliser un debugueur, ou simplement un valgrind bien configuré te le dirait tout de suite.

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2018 à 21:08:59

        Je n’ai pas bien compris votre explication mais je me doutais bien que l’erreur etait sur cette expression. Que signifie cette histoire d’index ?
        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2018 à 21:40:41

          Excuses-moi c'est vrai que ce n'est pas bien clair. Ce que je voulais dire, c'est qu'il y a cette "sous-expression"

          plateau->joueur[ligne_a][colonne_a]

          qui te donne une valeur V,

          Ensuite tu accèdes donc à

          joueurs[V]

          Puis enfin au champ .elimine

          Mon hypothèse, c'est que la valeur V est incorrecte, elle ne correspond pas à un index valide du tableau joueurs[] (c'est peut être pas un tableau mais un malloc(), mais peu importe). Tu serais donc en dehors du "tableau", donc tu écrirais ta valeur 1 à un endroit random de la mémoire, et tu ne modifierais pas ta variable comme attendu. Essayes donc d'afficher cette fameuse valeur V, sait-on jamais :)



          • Partager sur Facebook
          • Partager sur Twitter
            22 mai 2018 à 6:05:53

            En effet, c'était bien un problème d'index. L'erreur est corrigée, merci :)
            • Partager sur Facebook
            • Partager sur Twitter

            Changement d'une valeur dans un sous programme

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown