Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur les pointeurs!

Sujet résolu
    27 novembre 2008 à 18:35:19

    Hello à tous!
    Je suis un peu nerveux c'est ma première et sûrement pas ma dernière question sur ce site qui est vraiment excellent!

    Dans le cadre de mes études j'apprends la programmation en langage C, autrement dit je débute!

    Voilà ma question:

    J'ai deux boucles "for" distinctes qui appellent une même fonction mais avec des arguments différents. Seulement voilà, dans ma fonction je dois utiliser une variable "static". Logiquement donc, à la fin de la première boucle, la valeur de cette variable est gardée en mémoire. Mon problème est que j'ai besoin de remettre cette variable static à 0 entre les 2 boucles.

    Donc ma question: est-ce qu'on peut créer un pointeur sur cette variable static en sachant qu'elle est LOCALE à cette fonction??

    C'est un peu compliqué et je sais pas si je suis assez clair!
    Merci d'avance pour votre réponse

    à ++
    • Partager sur Facebook
    • Partager sur Twitter
      27 novembre 2008 à 18:41:28

      On peut avoir le code, ça serait plus facile :). Merci =).
      • Partager sur Facebook
      • Partager sur Twitter
        27 novembre 2008 à 18:46:25

        Si j'ai bien compris tu veux un truc de ce genre ?
        #include <stdio.h>
        
        void foo(int a, int b)
        {
            static int var = 0;
            
            if (var)
                var = 0;
        
            var = a + b;
            
            printf("var = %d \n", var);
        }
        
        int main(void)
        {
            int i, j;
        
            for (i = 0; i < 10; i++)
            {
                for (j = 0; j < 10; j++)
                {
                    foo(i, j);
                }
            }
        
            return 0;
        }
        


        • Partager sur Facebook
        • Partager sur Twitter
          27 novembre 2008 à 18:57:30

          Pas tout à fait. C'est un truc de ce genre:

          int haha(int a, int b)
          {
          int static c;

          c += a + c;

          return c;
          };

          void main()
          {
          int a, b,c, i;
          for (i=0,i<=10,i++)
          { scanf ("%d %d", &a, &b);
          c = haha (a,b)}



          for (i=0,i<=10,i++)
          { scanf ("%d %d", &a, &b);
          c = haha (a,b)}
          }


          Cet exemple est complètement bidon je sais mais en fait ce que j'aimerais c'est remettre la variable static c de haha à zéro entre les 2 boucles!
          • Partager sur Facebook
          • Partager sur Twitter
            27 novembre 2008 à 19:04:39

            Citation : Harpoon

            Pas tout à fait. C'est un truc de ce genre:

            int haha(int a, int b)
            {
            int static c;

            c += a + c;

            return c;
            };

            void main()
            {
            int a, b,c, i;
            for (i=0,i<=10,i++)
            { scanf ("%d %d", &a, &b);
            c = haha (a,b)}



            for (i=0,i<=10,i++)
            { scanf ("%d %d", &a, &b);
            c = haha (a,b)}
            }


            Cet exemple est complètement bidon je sais mais en fait ce que j'aimerais c'est remettre la variable static c de haha à zéro entre les 2 boucles!



            Je ne vois ici aucun pointeur sur ta variable static c... C'est techniquement possible de faire renvoyer à ta fonction l'adresse d'une variable statique et, par conséquent, d'accéder à cette variable depuis la fonction appelante. A mon avis, si tu cherches à faire cela, c'est qu'il y a un problème de conception quelque part. Pourrais-tu commencer par nous dire ce que tu veux faire ? Il y a certainement une manière plus propre que celle que tu désire implanter.

            Thierry
            • Partager sur Facebook
            • Partager sur Twitter
              27 novembre 2008 à 19:10:57

              Je sais qu'il n'y a pas de pointeur c'était justement l'objet de ma question: puis-je depuis l'extérieur pointer la variable c locale à la fonction haha pour la remettre à 0?

              Pour remettre dans le contexte je travaille sur un projet de calculatrice à chiffres romains. Je dois d'abord convertir les chiffres romains en chiffres arabes. Or cette fonction doit être appelée une fois pour chaque opérande de la fonction avec une remise à 0 d'une variable entre les deux appels!

              J'espère que c'est plus clair mais déjà merci pour vos réponses rapides!
              • Partager sur Facebook
              • Partager sur Twitter
                27 novembre 2008 à 19:32:59

                Citation : Harpoon

                J'ai deux boucles "for" distinctes qui appellent une même fonction mais avec des arguments différents. Seulement voilà, dans ma fonction je dois utiliser une variable "static".


                Une variable static ? Pourquoi ? C'est en général pas une bonne idée.

                Citation : Pas de titre

                Logiquement donc, à la fin de la première boucle, la valeur de cette variable est gardée en mémoire. Mon problème est que j'ai besoin de remettre cette variable static à 0 entre les 2 boucles.


                Voilà le genre de problèmes auquel on s'expose avec les variables statiques...

                Citation : Pas de titre

                Donc ma question: est-ce qu'on peut créer un pointeur sur cette variable static en sachant qu'elle est LOCALE à cette fonction??


                Oui. Sa portée est locale, mais elle est persistante...

                on peut évidemment écrire un code hideux comme ceci :
                #include <stdio.h>
                
                int count (int **ppc)
                {
                   static int c;
                
                   if (ppc != NULL && *ppc == NULL)
                   {
                      *ppc = &c;
                   }
                
                   c++;
                
                   return c;
                }
                
                int main (void)
                {
                   int *pc = NULL;
                
                   count (&pc);
                   if (pc != NULL)
                   {
                      int i;
                      *pc = 0;
                      for (i = 0; i < 5; i++)
                      {
                         printf ("%2d ", count (NULL));
                      }
                      printf ("\n");
                      *pc = 0;
                
                      for (i = 0; i < 5; i++)
                      {
                         printf ("%2d ", count (NULL));
                      }
                      printf ("\n");
                   }
                   return 0;
                }
                

                Le C ne manque pas de méthodes pour écrire des horreurs...
                .
                 1  2  3  4  5
                 1  2  3  4  5
                
                Process returned 0 (0x0)   execution time : 0.064 s
                Press any key to continue.


                Mais, sauf besoin clairement justifié et plutôt rare, je déconseille formellement ce genre de pratique douteuse. Le besoin de mémoire persistante existe, c'est indéniable, mais professionnellement, il se résout à coup de contextes (structures) et non à coup de 'statiques'...

                Le principal défaut des statiques est qu'elles empêchent l'instanciation. Pour gérer un objet unique, c'est OK, mais un objet est rarement unique. Par définition, c'est même l'exception...
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  27 novembre 2008 à 19:43:42

                  Merci pour la réponse!
                  J'enchaîne directement avec la question pratique: Comment je crée le pointeur sur cette variable?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 novembre 2008 à 21:05:23

                    Citation : Harpoon

                    Merci pour la réponse!
                    J'enchaîne directement avec la question pratique: Comment je crée le pointeur sur cette variable?



                    Si tu y tiens, regarde l'exemple posté par -ed-. Mais pourquoi persistes-tu sur cette voie ? Quel problème essaies-tu de résoudre de cette manière ? Est-il possible d'en savoir plus ?

                    Thierry
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 novembre 2008 à 1:26:37

                      Citation : Harpoon

                      J'enchaîne directement avec la question pratique: Comment je crée le pointeur sur cette variable?


                      Qu'est-ce que tu n'as pas compris dans le code que j'ai posté ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !

                      Question sur les pointeurs!

                      × 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