Partage
  • Partager sur Facebook
  • Partager sur Twitter

somme de nombres , variadique(C++ pas C)

C++

    22 mars 2019 à 20:38:27

    Bonjour

    voici un exercice de C que je me suis proposé de résoudre,

    mais j'avoue que je ne sais pas comment le mener à bien en C et pas en C++ :

    j'ai une fonction f(n, a,b,c,d,e,..) 

    où le premier entier est le nombre d'entiers à sommer et a , b c... sont les entiers.

    Comment faire pour calculer la somme des nombres a, b ... 

    Genre, j'aimerais pouvoir faire par exemple 

    f(3,1,1,1);
    

    et que ça me donne 3 , comme

    f(5,2,3,4,5,6);

    et que ça me donne : 20.

    et que ça me renvoie la somme systématiquement, quelque soit le nombre d'entiers.

    Comment faire cela en C (pas en C++) si c'est possible ?

    J'ai réfléchi à une récursivité , je n'ai pas d'idée sans passer par les variadiques tempalate du C++

    Merci


    -
    Edité par pseudo-simple 22 mars 2019 à 20:41:50

    • Partager sur Facebook
    • Partager sur Twitter
      22 mars 2019 à 21:43:16

      Si tu veux résoudre un problème en C et pas en C++ pourquoi tu postes sur le forum C++...
      • Partager sur Facebook
      • Partager sur Twitter
        22 mars 2019 à 21:55:10

        #include <type_traits>
          
        template <typename Arg, typename std::enable_if<std::is_integral<Arg>::value>::type * = nullptr>
        int add(Arg f, Arg s) { return f + s; }
          
        template <typename Arg, typename... Ts, typename std::enable_if<std::is_integral<Arg>::value>::type * = nullptr>
        int add(Arg f, Ts... rest) {
          return f + add(rest...);
        }
        • Partager sur Facebook
        • Partager sur Twitter
          22 mars 2019 à 21:57:47

          Bonsoir

          @joe_link_noir  : merci pour le tuyau en C. Je testerai .

          Avec les variadic template du C++, voici ce que j'ai fait, et il y a un blocage à la compilation.

          2|error: parameter packs not expanded with '...':|

          Pouvez-vous m'aider à trouver l'erreur ?

          template<typename... T>
          T sommation(int n, T&&... params)
          {
            T t=static_cast<T>(0);
            t=t+params...;
            return t;
          }

          Merci

          -
          Edité par pseudo-simple 22 mars 2019 à 22:03:32

          • Partager sur Facebook
          • Partager sur Twitter
            22 mars 2019 à 22:02:21

            YES, man a écrit:

            Bonsoir

            avec les variadic template,

            voici ce que j'ai fait, et il y a un blocage à la compilation.

            2|error: parameter packs not expanded with '...':|

            Pouvez-vous m'aider à trouver l'erreur ?

            template<typename... T>
            T sommation(int n, T&&... params)
            {
              T t=static_cast<T>(0);
              t=t+params...;
              return t;
            }

            Merci

            -
            Edité par YES, man il y a 2 minutes

            Tu dois l'apeller recursivement comme le code je t'ai donner plus haut.

            • Partager sur Facebook
            • Partager sur Twitter
              22 mars 2019 à 22:05:17

              1) Sachant que les variadic template comprennent l'idée de récursivité, n'est-il pas possible de faire sans la récursivité avec les variadic template ?

              2) à quoi sert

              typename std::enable_if<std::is_integral<Arg>::value>::type * = nullptr


              ?

              3) Avec ça, j'ai le même message d'erreur :

              template<typename Arg>
              Arg sommation(Arg f, Arg g){
              return f+g;
              }
              
              template<typename Arg, typename... T>
              T sommation(Arg f, T... params)
              {
                return f+sommation(params...);
              
              }



              -
              Edité par pseudo-simple 22 mars 2019 à 22:24:45

              • Partager sur Facebook
              • Partager sur Twitter
                22 mars 2019 à 22:53:52

                > Tu dois l'apeller recursivement comme le code je t'ai donner plus haut.

                Non, c'est généralement une connerie car:

                • cela complexifie le code en multipliant les fonctions
                • ralentis la compilation
                • allonge les erreurs de compilation

                Et maintenant il y a les folds.

                https://jonathanpoelen.github.io/2013/12/parcourir-les-arguments-dune-fonction-variadique/

                (Pourquoi restreindre le type ?)

                -
                Edité par jo_link_noir 22 mars 2019 à 22:55:55

                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  22 mars 2019 à 23:06:55

                  Sinon en C++17 il y a ça qui me semble encore plus simple. -> https://www.codingame.com/playgrounds/2205/7-features-of-c17-that-will-simplify-your-code/fold-expressions

                  Ah j'ai pas vu que tu donnais le lien vers la doc C++17 dans ton article.

                  -
                  Edité par Anonyme 22 mars 2019 à 23:07:49

                  • Partager sur Facebook
                  • Partager sur Twitter
                    22 mars 2019 à 23:18:14

                    Merci Joe_link_noir,

                    conseillez-vous de le faire avec ou sans récursivité alors ?

                    car sans récursivité (donc sur la deuxième partie de

                    https://jonathanpoelen.github.io/2013/12/parcourir-les-arguments-dune-fonction-variadique/, cela n'a pas l'air aussi évident que ça si l'on ne passe pas par les variadic templates.

                    La méthode récursive à base de variadic templates semble facile à implémenter.

                    PS : c'est anecdotique, mais il y a une coquille sur la page dans la première partie avec la récursivité :

                    il manque l'affichage du premier 1.

                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      23 mars 2019 à 9:20:41

                      Toi tu n'as pas lu correctement.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        25 mars 2019 à 9:11:35

                        Bonjour,

                        Mauvais forum

                        Le sujet est déplacé de la section Langage C++ vers la section Langage C

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

                        somme de nombres , variadique(C++ pas C)

                        × 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