Partage
  • Partager sur Facebook
  • Partager sur Twitter

Modifier les valeurs tableau dans struct via fonct

Sujet résolu
    8 décembre 2019 à 1:51:18

    Bonjour j'ai un exercice dans celui ci j'ai créer un define N 10 ( a la demande) 

    j'ai ensuite créer une struct Tab qui contient uniquement un tableau de N entier.. seulement voilà impossible de modifier les valeurs dans le tableau via une fonction alors que la fonction qui y ajoute une valeur aléatoire viens du professeur.. :/ 

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    #define N 10
    
    typedef struct Tab Tab;
    
    struct Tab
    {
        int tableau[N];
    };
    
    void remplirTableau(Tab t, int n)
    {
        int i ;
        srand ( time(NULL) ); // initialise le random
        for (i=0; i<n; i++)
            t.tableau[i]= rand() % n; // t [ i ] recoit une valeur aleatoire modulo n 
    }// fonction du prof
    
    
    int main()
    {
        Tab t = {0,0,0,0,0,0,0,0,0,0};
    
        remplirTableau(t,N);
        for(int i=0;i<N;i++)
            printf("%d ",t.tableau[i]);
    }


    Il n'y a pas d'erreur seulement.. le tableau contient toujours 10 valeurs '0'...

    -
    Edité par IppoAnime 8 décembre 2019 à 1:52:13

    • Partager sur Facebook
    • Partager sur Twitter
      8 décembre 2019 à 2:10:54

      Salut,

      Ta fonction remplirTableau() travaille sur une copie de t, pas sur t. Il faut envoyer un pointeur sur ta structure si tu veux la modifier.

      Bonne continuation.

      • Partager sur Facebook
      • Partager sur Twitter

      Bonhomme !! | Jeu de plateforme : Prototype.

        8 décembre 2019 à 2:21:24

        Merci bien , donc si j'ai bien compris le code dois plus ressembler a celà ?

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        
        #define N 10
        
        typedef struct Tab Tab;
        
        struct Tab
        {
            int tableau[N];
        };
        
        void remplirTableau(Tab *t, int n)
        {
            int i ;
            srand ( time(NULL) ); // initialise le random
            for (i=0; i<n; i++)
                t.tableau[i]= rand() % n; // t [ i ] recoit une valeur aleatoire modulo n (Erreur)
        }
        
        
        int main()
        {
            Tab t = {0,0,0,0,0,0,0,0,0,0};
        
            remplirTableau(*t,N);
            for(int i=0;i<N;i++)
                printf("%d ",t.tableau[i]);
        }
        

        Mais il m'indique une erreur me disant request for member 'tableau' in something not a structure or union

        Désolé je manque cruellement d'expérience :/

        -
        Edité par IppoAnime 8 décembre 2019 à 2:22:54

        • Partager sur Facebook
        • Partager sur Twitter
          8 décembre 2019 à 2:27:15

          Re,

          Normal, dans ta fonction t est un pointeur sur une structure, pas une structure. Donc ligne 19  la syntaxe n'est pas : t.tableau[i] mais t->tableau[i]

          • Partager sur Facebook
          • Partager sur Twitter

          Bonhomme !! | Jeu de plateforme : Prototype.

            8 décembre 2019 à 2:48:19

            J'avais testé cette syntaxe seulement à mes yeux elle n'étais pas correct du à l'erreur a cette ligne 

            int main()
            
            {
            
                Tab t = {0,0,0,0,0,0,0,0,0,0};
            
            
            
                remplirTableau(*t,N);// Erreur
            
                for(int i=0;i<N;i++)
            
                    printf("%d ",t.tableau[i]);
            
            }
            
            
            

            L'erreur : invalid type argument of unary '*' (have 'Tab {aka struct Tab}')

            je comprend que l'étoile pose soucis seulement en l'enlevement sa ne marche pas.. sa me fais penser a soulever une autre question toi qui semble t'y connaitre.. une erreur plus bas dans un code.. ne veut pas dire qu'il n'y a pas d'erreur plus haut si? 

            • Partager sur Facebook
            • Partager sur Twitter
              8 décembre 2019 à 4:30:08

              Bonjour 

              à votre ligne 9 il faut donner l'adresse par un &

              votre t n'a pas d'adresse pour valeur (votre t n'est pas un pointeur) mais votre fonction prend une adresse (elle prend un pointeur) 

              comme dans le code ci-dessous (qui fonctionne )

              #include <stdio.h>
              #include <stdlib.h>
              #include <time.h>
              #define N 10
              
              typedef struct Tab Tab;
              struct Tab
              {
                  int tableau[N];
              } ;
              void remplirTableau(Tab *t,int n)
              {
                  int i;
                  srand(time(NULL));
                  for (i=0;i<n;i++)
                  {
                      t->tableau[i]=rand()%n;
                  }
              }
              int main(int argc,char *argv[])
              {
                  int i;
                  Tab t;
                  remplirTableau(&t,N);
                  for (i=0;i<N;i++)
                  {
                      printf("%d\n",t.tableau[i]);
                  }
                  return 0;
              }
              


              -
              Edité par DominiqueSicilia 8 décembre 2019 à 4:53:21

              • Partager sur Facebook
              • Partager sur Twitter
                8 décembre 2019 à 4:54:46

                Merci pour votre aide je vais me permettre de mettre en résolu, merci , je ne referai plus ce genre d'erreur :)
                • Partager sur Facebook
                • Partager sur Twitter
                  8 décembre 2019 à 4:59:57

                  de rien

                  par ailleurs à la ligne 23 de mon code

                  Tab t; suffit

                  puisque la variable de type Tab c'est t (et pas un tableau) 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 décembre 2019 à 5:15:44

                    DominiqueSicilia a écrit:

                    de rien

                    par ailleurs à la ligne 23 de mon code

                    Tab t; suffit

                    puisque la variable de type Tab c'est t (et pas un tableau) 

                    J'ai juste fais sa pour initialiser t.tableau a 0 enfin les N valeurs (10) je pense pas que créer une fonction pour initialiser a 0 étais nécessaire pour si peu.. Tab t; n'initialisera pas à 0 j'imagine



                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 décembre 2019 à 5:20:42

                      oui mais dans ce cas il faut faire Tab t={{0}};

                      le {0} initialise ton tableau et le {{0}} indique que ta structure est un singleton

                      car ta structure n'est composée que d'un tableau

                      écrire Tab t={0,0,0,0,0,0,0,0,0,0};

                      veut dire que tu as placé un assemblage de dix objets dans ta structure

                      et normalement il te place un warning

                      regarde ligne 23 à présent (avec l'initialisation)

                      #include <stdio.h>
                      #include <stdlib.h>
                      #include <time.h>
                      #define N 10
                      
                      typedef struct Tab Tab;
                      struct Tab
                      {
                          int tableau[N];
                      } ;
                      void remplirTableau(Tab *t,int n)
                      {
                          int i;
                          srand(time(NULL));
                          for (i=0;i<n;i++)
                          {
                              t->tableau[i]=rand()%n;
                          }
                      }
                      int main(int argc,char *argv[])
                      {
                          int i;
                          Tab t={{0}};
                          remplirTableau(&t,N);
                          for (i=0;i<N;i++)
                          {
                              printf("%d\n",t.tableau[i]);
                          }
                          return 0;
                      }
                      

                      -
                      Edité par DominiqueSicilia 8 décembre 2019 à 5:31:59

                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 décembre 2019 à 11:29:07

                        IppoAnime a écrit:

                        je ne referai plus ce genre d'erreur :)


                        On parie ?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 décembre 2019 à 11:59:45

                          Personnellement, quand je manipule un pointeur sur tableau, j'évite de lui donner le même nom qu'un tableau, ça prête à confusion. Par exemple si je définis :

                          void remplirTableau(Tab *pt, int n)

                          je vois immédiatement que 'pt' est un pointeur, du coup je minimise le risque d'écrire

                          pt.tableau[i]

                          au lieu de

                          pt->tableau[i]

                          Il est vrai que je n'ai jamais été à l'aise avec les pointeurs, du coup je préfère savoir en permanence si la variable que je manipule est un pointeur ou non.

                          -
                          Edité par robun 8 décembre 2019 à 12:00:13

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Modifier les valeurs tableau dans struct via fonct

                          × 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