Partage
  • Partager sur Facebook
  • Partager sur Twitter

Transmettre valeur variable entre fonctions

    4 août 2021 à 15:14:46

    Bonjour,

    Je me résigne (un peu honteusement) à poser une question vraiment très, très basique..

    Imaginons que j'ai deux fonctions :

    Le seul moyen de récupérer la valeur de variable dans le main est d'utiliser les pointeurs ?

    int test() 
    {
        int variable = 19;
    }
    
    int main ()
    {
        test();
        printf("%d", variable);
        return 0;
    }

    PS : j'y parviens ainsi mais ça me parait pas très propre de stocker la valeur dans une nouvelle variable2 :

    int test() 
    {
        int variable = 19;
        return variable;
    }
    
    int main ()
    {
        int variable2 = test();
        printf("%d", variable2);
        return 0;
    }

    -
    Edité par BetaDuCentaure 4 août 2021 à 15:26:27

    • Partager sur Facebook
    • Partager sur Twitter
      4 août 2021 à 15:25:38

      Pas très propre? Et ça marche?
      Le return est la meilleure façon de retourner une valeur, sinon il n'y aurait pas d'énoncé return
      • Partager sur Facebook
      • Partager sur Twitter

      Le Tout est souvent plus grand que la somme de ses parties.

        4 août 2021 à 15:29:07

        Ok merci.

        A part avec les pointeurs, aucun moyen de récupérer la valeur de "variable" sans devoir la stocker dans une autre ? J'ai parfois du mal à faire communiquer la valeur de retour de mes fonctions.

        • Partager sur Facebook
        • Partager sur Twitter
          4 août 2021 à 15:31:21

          Bonjour,

          la variable variable n'existe que et uniquement dans la fonction test, pas en dehors. C'est la notion qu'on appelle durée de vie d'une variable ; la durée de vie vie de la variable variable est limitée au bloc qui la contient. D'ailleurs, pour faire simple, et en première approximation, toute variable, dès qu'elle est déclarée, a une durée de vie limitée au bloc qui la contient. Un bloc c'est une portion de code comprise entre deux accolades, ou la totalité du programme s'il n'y en a pas (ou si elle est déclarée static, mais cela est une autre histoire).

          À partir de là, si tu veux communiquer des valeurs de sortie tu as le choix entre :

          • renvoyer une valeur

              void foo(void)
              {
                  return 19;
              }
                
              int main(void)
              {
                  printf("%d\n",  foo() );
                  return 0;
              }
            


          • indiquer à la fonction une zone mémoire qu'elle pourra utiliser pour y stocker une valeur = utiliser un pointeur

              void foo(int *value)
              {
                  *value=19;
              }
                
              int main(void)
              {
                  int variable;
                  foo(&variable);
                  printf("%d\n", variable);
                  return 0;
              }
            


          Il y a deux notions importantes concernant les variables :

          • la durée de vie ;
          • la portée = les endroits dans le code où une variable est visible ;

          Les bons cours en parlent.

          Les langages plus modernes ajoutent également les notions de mutabilité et d'appartenances, mais cela ne nous concerne pas ici.

          Edit:

          BetaDuCentaure a écrit: > >[...] >J'ai parfois du mal à faire communiquer la valeur de retour de mes fonctions.

          C'est à dire ???

          -
          Edité par White Crow 4 août 2021 à 15:34:12

          • Partager sur Facebook
          • Partager sur Twitter
            4 août 2021 à 15:41:43

            WhiteCrow => Merci beaucoup. J'avais complètement omis le fait que la valeur d'une variable est dépendante du bloc dans lequel elle est contenu. Ton explication éclaircit pas mal de mes problèmes.

            WhiteCrow à écrit =>C'est à dire ???

            Je mélange encore pas mal de chose sur les valeurs de retour (et surtout les pointeurs). La par exemple, je refait le jeu du pendu du cours C. J'ai un main qui applique le jeu du pendu (suivi d'autres fonctions) et une fonction motAleat qui pioche un mot au hasard dans un fichier.txt.

            Ma fonction motAleat fonctionne, elle me sort un mot au hasard depuis le fichier, mais je galère encore (bêtement pour un truc aussi simple) à renvoyer la valeur du "motMystere" à mon main. C'est frustrant et bizare de bloquer sur un truc aussi anodin après avoir recodé laborieusement le jeu du pendu, mais je vais me pencher sur le problème.

            En tout cas ton explication est parfaite et je retiens surtout que la valeur d'une variable ne peut pas être sorti de son bloc.

            • Partager sur Facebook
            • Partager sur Twitter
              4 août 2021 à 15:44:41

              BetaDuCentaure a écrit:

              [...]

              En tout cas ton explication est parfaite et je retiens surtout que la valeur d'une variable ne peut pas être sorti de son bloc.


              Attention ce n'est pas la valeur de la variable qui ne peut être transmise, c'est la variable elle-même. Tous les passages en C se font par valeur justement.

              • Partager sur Facebook
              • Partager sur Twitter
                4 août 2021 à 15:45:48

                Oui désolé, abus de langage. J'ai bien compris le principe ;)

                Bonne journée à toi

                • Partager sur Facebook
                • Partager sur Twitter
                  4 août 2021 à 16:10:04

                  Mais est-ce que tu as compris qu'il faut utiliser 'return', comme l'avait indiqué Pierrot dès le début ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 août 2021 à 16:16:33

                    Robun >

                    Je pense, oui. CF mon deuxieme bloc de code (dans mon post initial).

                    -
                    Edité par BetaDuCentaure 4 août 2021 à 16:41:19

                    • Partager sur Facebook
                    • Partager sur Twitter
                      13 août 2021 à 22:33:09

                      Salut, si j'ai bien compris t'a question, je l'aurais fait de cette manière 



                      int test(int variable) <------
                      {
                          
                          printf("%d", variable)
                      }
                      
                      int main()
                      {
                          int variable = test();
                          printf("%d", variable);
                          test(variable); //<-------
                          
                      }
                      • Partager sur Facebook
                      • Partager sur Twitter
                        14 août 2021 à 1:09:41

                        As-tu compilé ton code?
                        L'erreur principale est que tu appelles la fonction sans paramêtre et que tu ne retournes rien.
                        Ça ne compile pas.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                          14 août 2021 à 12:16:23

                          Oui je m'en suis sorti, merci :)
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Transmettre valeur variable entre fonctions

                          × 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