Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Problème de modification de tableau par pointeur

résultat inexplicable, fonctionnant a moitié.

Sujet résolu
    24 août 2006 à 11:09:49

    Bonjour,
    J'ai rencontré un problème dans un plus gros projet et je l'ai "isolé" ici dans un petit programme.

    bloc est un pointeur vers un element de tab.
    aff(tab) affiche le tableau tab
    modif(tab,p,N) met a zéro l'élément qu'il pointe et édite la N ième valeur de l'element du tableau tab pointé par p.


    #include <stdlib.h>
    #include <stdio.h>

    void aff(int * tab){
        printf("{ ");
        int i;
        for(i=0;i<=9;printf("%d,",tab[i++]))
            ;
        printf("\b }\n");
    }

    void modif(int * tab, int * p, int d){
        *p = 0;
        p = &tab[d];
        *p = 1;
    }

    int main(void){

        int tab[10]={0,0,0,0,0,0,0,0,0,0};
        aff(tab);
        putchar('\v');
        int * bloc = &tab[0];
        int i;

        for(i=0;i<=9;i++){
            modif(tab,bloc,i);
            aff(tab);
        }

        return 0;
    }



    Mais contre toute logique, le résultat s'avère être mauvais :

    { 0,0,0,0,0,0,0,0,0,0 }

    { 1,0,0,0,0,0,0,0,0,0 }
    { 0,1,0,0,0,0,0,0,0,0 }
    { 0,1,1,0,0,0,0,0,0,0 }
    { 0,1,1,1,0,0,0,0,0,0 }
    { 0,1,1,1,1,0,0,0,0,0 }
    { 0,1,1,1,1,1,0,0,0,0 }
    { 0,1,1,1,1,1,1,0,0,0 }
    { 0,1,1,1,1,1,1,1,0,0 }
    { 0,1,1,1,1,1,1,1,1,0 }
    { 0,1,1,1,1,1,1,1,1,1 }

    Edit: Notez qu'aux 2 premières itération (2 premières lignes du "carré"), ça à l'air de fonctionner..

    En toute logique je *devrais* obtenir quelquechose comme ça :

    { 0,0,0,0,0,0,0,0,0,0 }

    { 1,0,0,0,0,0,0,0,0,0 }
    { 0,1,0,0,0,0,0,0,0,0 }
    { 0,0,1,0,0,0,0,0,0,0 }
    { 0,0,0,1,0,0,0,0,0,0 }
    { 0,0,0,0,1,0,0,0,0,0 }
    { 0,0,0,0,0,1,0,0,0,0 }
    { 0,0,0,0,0,0,1,0,0,0 }
    { 0,0,0,0,0,0,0,1,0,0 }
    { 0,0,0,0,0,0,0,0,1,0 }
    { 0,0,0,0,0,0,0,0,0,1 }


    • Partager sur Facebook
    • Partager sur Twitter
      24 août 2006 à 12:54:55

      Ca me semble normal, tu mets tab[i] = 1, tu passes à tab[i+1] = 1 mais tu ne remets pas tab[i] = 0 alors bah tu gardes les 1


      #include <stdlib.h>
      #include <stdio.h>

      void aff(int * tab){
          printf("{ ");
          int i;
          for(i=0;i<=9;printf("%d,",tab[i++]));
          printf("}\n");
      }

      void modif(int * tab, int * p, int d){
          *p = 0;
          p = &tab[d];
          *p = 1;
      }

      int main(void){

          int tab[10]={0,0,0,0,0,0,0,0,0,0};
          aff(tab);
          int * bloc = &tab[0];
          int i;

          for(i=0;i<=9;i++){
              if(i != 0) tab[i-1] = 0; // remettre l'élément précédant à 0
              modif(tab,bloc,i);
              aff(tab);
          }

          return 0;
      }



      { 0,0,0,0,0,0,0,0,0,0,}
      { 1,0,0,0,0,0,0,0,0,0,}
      { 0,1,0,0,0,0,0,0,0,0,}
      { 0,0,1,0,0,0,0,0,0,0,}
      { 0,0,0,1,0,0,0,0,0,0,}
      { 0,0,0,0,1,0,0,0,0,0,}
      { 0,0,0,0,0,1,0,0,0,0,}
      { 0,0,0,0,0,0,1,0,0,0,}
      { 0,0,0,0,0,0,0,1,0,0,}
      { 0,0,0,0,0,0,0,0,1,0,}
      { 0,0,0,0,0,0,0,0,0,1,}

      Press ENTER to continue.
      • Partager sur Facebook
      • Partager sur Twitter
        24 août 2006 à 13:02:36

        Oui, mais le pointeur lui ne change pas d'élément pointé tant que je ne le modifie pas, peut importe la valeur de tab[i] , *p contient toujours la valeur du même élément..


        void modif(int * tab, int * p, int d){
            *p = 0; /* l'élément datant de l'ancien appel de la fonction est mis a zéro */
            p = &tab[d]; /* pointe sur l'élément suivant */
            *p = 1; /* le nouveau (et bientot le futur ancien) est a 1 */
        }
        • Partager sur Facebook
        • Partager sur Twitter
          24 août 2006 à 13:11:38

          Certes, mais c'est tab que tu affiches dans ta fonction d'affichage . . . et les éléments armés à 1 restent.

          Tu es peux être trompés par l'idée du résultat que tu penses obtenir
          • Partager sur Facebook
          • Partager sur Twitter
            24 août 2006 à 13:11:59

            sauf que quand tu modifies *p, ça modifie "tab", mais après tu affectes une nouvelle adresse à "p" qui est local à ta fonction (puisque c'est un de ses paramètres), et donc cette affectation est perdue dès que tu sors de "modif" (il te faudra utiliser un pointeur de pointeur pour régler ce problème).

            [edit] heu nan au temps pour moi, j'ai mal lu, c'est faux ^^

            [edit 2] en fait si, le problème c'est bien que "*p" au début de la fonction pointe toujours sur la 1ere case du tableau, et qu'il n'y a donc qu'elle qui est systématiquement remise à zéro
            • Partager sur Facebook
            • Partager sur Twitter
              24 août 2006 à 13:14:41

              Damned, j'ai effectivement oublié le problème de portée..
              Merci. :)

              Edit: il me suffit de retourner p :

              int  * modif(int * tab, int * p, int d){
                  *p = 0;
                  p = &tab[d];
                  *p = 1;
                  return p;
              }


              et :


              for(i=0;i<=9;i++){
                      bloc = modif(tab,bloc,i);
                      aff(tab);
                  }


              Encore merci :)
              • Partager sur Facebook
              • Partager sur Twitter

              [C] Problème de modification de tableau par pointeur

              × 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