Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau 2D

    28 mars 2017 à 22:41:45

    Bonjour,

    Peut-on passer un tableau 2d de taille fixe en paramètre d'une fonction. Sachant que ce tableau 2d est déclaré en variable globale. 

    Doit-on forcément passer par l'allocation dynamique ?

    Merci pour l'aide =)

    • Partager sur Facebook
    • Partager sur Twitter
      28 mars 2017 à 22:44:51

      S'il est en global tu n'as pas besoin de le passer en paramètre il me semble
      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2017 à 22:48:52

        Si car c'est une fonction présente dans un autre fichier
        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2017 à 22:56:39

          Bonjour,

          l'idée de la variable globale est justement qu'elle soit accessible de partout … soit ut as absolument besoin que cette variable soit globale (ce qui est peu probable) et dans ce cas il suffit de la déclarer là où tu veux l'utiliser ; soit tu la passes en paramètre comme n'importe quelle autre variable …

          • Partager sur Facebook
          • Partager sur Twitter
          First solve the problem. Then, write the code. ~ John Johnson
            28 mars 2017 à 23:02:22

            Globale seulement à ce fichier

            en gros j'ai ça

            test est un tableau de chaines de caracteres de taille N

            char * test[N]
            
            void f()
            {
               appel(test);
            }

            et dans un autre fichier

            appel(char *test)
            {
                int i;
                for(i=0; i< N; i++)
                    printf("%s",test[i]);
            }

            et ça crash au niveau du printf


            -
            Edité par joezzz 28 mars 2017 à 23:03:10

            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2017 à 23:09:40

              joezzz a écrit:

              Globale seulement à ce fichier

              en gros j'ai ça

              test est un tableau de chaines de caracteres de taille N

              char * test[N]
              
              void f()
              {
                 appel(test);
              }

              et dans un autre fichier

              appel(char *test)
              {
                  int i;
                  for(i=0; i< N; i++)
                      printf("%s",test[i]);
              }

              et ça crash au niveau du printf


              -
              Edité par joezzz il y a moins de 30s

              PicoDev a écrit:

              Bonjour,

              soit ut as absolument besoin que cette variable soit globale (ce qui est peu probable) et dans ce cas il suffit de la déclarer là où tu veux l'utiliser

              void appel(void)
              {
                  extern char *test[];
                  int i;
                  for(i=0; i< N; i++)
                      printf("%s",test[i]);
              }

              PicoDev a écrit:

              soit tu la passes en paramètre comme n'importe quelle autre variable …

              void appel(char *test[])
              {
                  int i;
                  for(i=0; i< N; i++)
                      printf("%s",test[i]);
              }



              Bon, j'imagine que ce sont des exemples mais en général :

              • c'est mieux de ne pas utiliser de variables globales
              • c'est mieux d'éviter des noms qui en cachent d'autres (test variable globale vs test variable locale)
              • c'est mieux d'utiliser static si tu veux réduire la visibilité d'une variable globale au niveau d'un fichier →
                 
                static char * test[N];
              • Partager sur Facebook
              • Partager sur Twitter
              First solve the problem. Then, write the code. ~ John Johnson
                28 mars 2017 à 23:16:02

                J'ai toujours le crash au printf.

                Je remplie mon tableau comme ceux ci

                char message = "aaa";
                
                strcpy(&test[0], message);


                sans le & ça crash a ce niveau.

                Je crois que je m'embrouille un peu trop là

                je vais aller dormir ça sera mieux x)

                -
                Edité par joezzz 28 mars 2017 à 23:20:42

                • Partager sur Facebook
                • Partager sur Twitter
                  28 mars 2017 à 23:21:18

                  (Oups, je crois que j'ai mal lu la discussion...)

                  Tu dis :

                  test est un tableau de chaines de caracteres de taille N

                  Je me demande si ce n'est pas plutôt : test est un tableau de N chaînes de caractères (là tu as l'air de dire que ce sont les chaînes de caractères qui sont de taille N, or leur taille n'est pas connue). C'est même un tableau de N pointeurs (sur 'char') je crois.

                  -
                  Edité par robun 28 mars 2017 à 23:27:52

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mars 2017 à 23:23:06

                    joezzz a écrit:

                    J'ai toujours le crash au printf.

                    Je remplie mon tableau comme ceux ci

                    char message = "aaa";
                    
                    strcpy(&test[0], message);


                    sans le & ça crash a ce niveau.

                    Je crois que je m'embrouille un peu trop là

                    je vais aller dormir ça sera mieux x)

                    -
                    Edité par joezzz il y a moins de 30s


                    Si ton test est bien un char *test[] alors il faut allouer le char * avant de le remplir … ou utiliser strdup. Dans les deux cas il faut penser à libérer les ressources allouées.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    First solve the problem. Then, write the code. ~ John Johnson
                      28 mars 2017 à 23:24:01

                      Oui car c'est un tableau qui contient des chaines de caractères donc pour afficher une chaine en C s'est %s

                      bah le prog plante 

                      et nan ya pas d'erreur de compilation

                      Ok bah je vais passer par des mallocs alors

                      -
                      Edité par joezzz 28 mars 2017 à 23:29:00

                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mars 2017 à 23:29:42

                        (Pour info, joezzz vient de répondre à mon précédent message, mais je l'ai modifié entre temps car ce que je disais était faux.)

                        joezzz : est-ce que tu souhaites que les chaînes de caractères du tableau aient une taille de N, ou est-ce que tu souhaites avoir N chaînes de caractères de taille quelconque ?

                        -
                        Edité par robun 28 mars 2017 à 23:31:23

                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 mars 2017 à 23:30:37

                          Bon, strcpy comment ça marche ?

                          Tu lui donnes un char* alloué et pointant vers une zone suffisamment grande, ensuite tu copies la chaîne que tu veux dedans ; sinon ça ne va pas fonctionner. Le plus simple est de passer par strdup → test[0]=strdup("foo") ou test[0]=malloc(....); strcpy(test[0],"foo");

                          -
                          Edité par PicoDev 28 mars 2017 à 23:31:30

                          • Partager sur Facebook
                          • Partager sur Twitter
                          First solve the problem. Then, write the code. ~ John Johnson
                            28 mars 2017 à 23:39:34

                            N chaines de caractère de taille S

                            là je test avec les doubles pointeurs ducoup et malloc

                            ce qui me donne

                            void appel(char ** test)
                            {
                                printf("%s", test[i]);
                            }

                            et

                            void f()
                            {
                               appel(test);
                            }

                            et

                            char **test= NULL;
                                test= (char**) malloc (N* sizeof(char*));
                                for(i=0 ; i<N; i++)
                                    test[i] = (char*) malloc (S* sizeof(char));





                            -
                            Edité par joezzz 28 mars 2017 à 23:42:44

                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 mars 2017 à 23:43:29

                              Ah OK (j'avais mal compris, du coup). N et S sont des constantes ? Si oui, il suffit peut-être de déclarer un tableau bidimensionnel de caractères ?

                              -
                              Edité par robun 28 mars 2017 à 23:43:56

                              • Partager sur Facebook
                              • Partager sur Twitter
                                28 mars 2017 à 23:46:26

                                Oui N est une constante mais finalement je crois que S sera une variable car les mots peuvent etre de taille différente
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Tableau 2D

                                × 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