Partage
  • Partager sur Facebook
  • Partager sur Twitter

Passer un tableau en fonction

les fonctions et les tableaux

    21 août 2021 à 12:04:56

    Salut la famille, je m'exerce au C++. J'essai de faire un test avec un tableau en fonction mais depuis ce ne sont que des echecs.

    Je code avec CodeBlock. Je vous mets les codes pour que vous puissiez m'aider a comprendre ce qui ne va pas.

    #include <iostream>

    using namespace std;

    //fonction d'un tableau qui rnvoie la somme

    double somme (tableau[], int taille)

    {

        double som;

        for(int i(0); i<taille; i++)

        {

            som += tableau[i];

            return som;

        }

    }

    int main()

    {   int taille(3);

        double noteVote[taille];

        double total(0);

        noteVote[0]= 15;

        noteVote[1]=10;

        noteVote[2]=45;

        total= somme(noteVote, taille)

        cout <<"le premier calcul donne : "<<total<<endl;

        for(int i(0); i<taille; i++)

            {

                total +=noteVote[i];

                cout <<"le second calcul donne : "<<total<<endl;

            }

            return 0;

    }

    voici le message qui vient quand le lance le programme

    • Partager sur Facebook
    • Partager sur Twitter
      21 août 2021 à 12:29:36

      Bonjour,

      Le message qui suit est une réponse automatique activée par un membre de l'équipe. Les réponses automatiques leur permettent d'éviter d'avoir à répéter de nombreuses fois la même chose, ce qui leur fait gagner du temps et leur permet de s'occuper des sujets qui méritent plus d'attention.
      Nous sommes néanmoins ouverts et si vous avez une question ou une remarque, n'hésitez pas à contacter la personne en question par Message Privé.

      Pour plus d'informations, nous vous invitons à lire les règles générales du forum

      Merci de colorer votre code à l'aide du bouton Code

      Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Code de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: cpp;">Votre code ici</pre>.

      Merci de modifier votre message d'origine en fonction.

      Liens conseillés

      • Partager sur Facebook
      • Partager sur Twitter
        21 août 2021 à 13:36:06

        Salut :) ! Je te conseille d'utiliser std::vector. Tu peux récupérer sa taille grâce à size() et accéder à un élément grâce aux crochets.
        • Partager sur Facebook
        • Partager sur Twitter
          23 août 2021 à 9:38:31

          Salut quelques conseils en vracs, copie/colle tes messages d'erreurs plutôt que de faire une capture d'écran. Chez moi les images ne s'affichent pas et même si ça s'affiche on peut pas copier ton erreur dans google si on veut vérifier 

          Evite d'utilser using namespace std, tu trouveras une explication détaillée ici

          A la place il faut utiliser le nom complet des fonctions ou des objets ==> std::cout à la place de cout  / std::string à la place de string  / std::vector à la place de vector  ect ...

          Comme l'a dit MO9845, utilise plutôt std::vector que les vieux tableaux à la C. Globalement, privilégie toujours les éléments de la bibliothèque standard pour construire ton code

          Pour passer un tableau en paramètre d'une fonction (ou n'importe quel type "complexe" ie autre que les types de bases) il faut (sauf cas particuliers) les passer par référence et même par référence constante si possible. Lorsque tu ne passes pas l'argument par référence, on dit qu'il est passé par "valeur" ou par "copie" parce que ta fonction travaillera en réalité sur une copie locale de ton tableau. En plus d'être couteux en ressource de faire la copie d'un tableau, si tu changes une valeur du tableau dans ta fonction tu perdras cette modification en dehors de ta fonction.

          Je te laisse creuser un petit ce sujet mais en attendant tu peux run ce morceaux de code et essayer de comprendre ce qu'il se passe entre un passage par référence et un passage par valeur, tu as ici tout ce qu'il faut pour voir la différence entre les deux. A toi de creuser pour bien comprendre ;)

          #include <iostream>
          #include <vector>
          
          
          void afficherTableau(const std::vector<int>& tab)
          {
          	for (const auto elem : tab)
          		std::cout << elem << std::endl;
          	std::cout << "------------------" << std::endl;
          }
          
          void multiplieParDeuxReference(std::vector<int>& tab)	// Passage par référence avec '&'
          {
          	for (std::size_t i = 0; i < tab.size(); ++i) {
          		tab[i] *= 2;
          	}
          }
          
          void multiplieParDeuxValeur(std::vector<int> tab)	// Passage par valeur sans le '&'
          {
          	for (std::size_t i = 0; i < tab.size(); ++i) {
          		tab[i] *= 2;
          	}
          
          	std::cout << "Dans la fonction par valeur : j'affiche tab" << std::endl;
          	afficherTableau(tab);
          }
          
          int main() {
          
          	std::vector<int> exempleTab{ 1,2,3,4,5,6,7,8,9 };
          	afficherTableau(exempleTab);
          
          	multiplieParDeuxValeur(exempleTab);
          	std::cout << "Apres la fonction par valeur : j'affiche exempleTab" << std::endl;
          	afficherTableau(exempleTab);
          
          	multiplieParDeuxReference(exempleTab);
          	afficherTableau(exempleTab);
          	
          
          	return 0;
          }



          • Partager sur Facebook
          • Partager sur Twitter
            23 août 2021 à 10:12:16

            ThibaultVnt a écrit:

            Lorsque tu ne passes pas l'argument par référence, on dit qu'il est passé par "valeur" ou par "copie" parce que ta fonction travaillera en réalité sur une copie locale de ton tableau. En plus d'être couteux en ressource de faire la copie d'un tableau, si tu changes une valeur du tableau dans ta fonction tu perdras cette modification en dehors de ta fonction.

            C'est faux ! Pour le cas des tableaux c'est toujours l'adresse du tableau qui est passé en argument. Mais bien sûr on évite de les utiliser en C++, on privilégie les vector ou array  à la place.

            • Partager sur Facebook
            • Partager sur Twitter
              23 août 2021 à 12:40:39

              Oui tu as raison merci de ta correction, utilisant rarement les tableaux C-style j'ai rédigé mon message en ayant en tête les tableaux types std::array et std::vector 

              My bad pour cette erreur !

              • Partager sur Facebook
              • Partager sur Twitter
                9 septembre 2021 à 19:18:42

                ThibaultVnt a écrit:

                Oui tu as raison merci de ta correction, utilisant rarement les tableaux C-style j'ai rédigé mon message en ayant en tête les tableaux types std::array et std::vector 

                My bad pour cette erreur !


                J'en profite pour poser un petite question. Quelle est la différence entre std::vector, std::list et std::array ?

                Pour la solution, innoce_nda, tu peux essayer :

                #include <vector>
                #include <string>
                #include <iostream>
                
                void printVector(std::vector<std::string> values)
                {
                    for (std::string value : values) // récupérer toutes les valeurs
                        std::cout << value; // rajouter std::endl pour revenir à la ligne
                }
                
                int main()
                {
                    std::vector<std::string> values = {"Le", " C++", ", c'est", " bien"}; // créer un tableau
                    printVector(values); // appeler la fonction
                }



                • Partager sur Facebook
                • Partager sur Twitter
                  9 septembre 2021 à 21:06:29

                  Le std::vector est un tableau dont tu peux modifier la taille à l'exécution.

                  Le std::array est un tableau dont la taille est fixée à la compilation.

                  La std::list est une liste doublement chaînée. 

                  • Partager sur Facebook
                  • Partager sur Twitter
                    9 septembre 2021 à 21:21:55

                    Il y a un petit piège avec std::list : Lorsque que l'on supprime un noeud avec un itérateur, on ne devrait pas continuer de poursuivre la liste avec cet itérateur. En plusieurs années de programmation je n'ai jamais eu de warning ou de message SIGSEGV en session de débuggage avec MingW / Gcc. Par contre avec le compilateur de Visual Studio , j'ai pu comprendre que j'avais fait cette erreur , car j'avais un avertissement pendant une session de debuggage.:)

                    -
                    Edité par Warren79 14 septembre 2021 à 20:52:48

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Mon site web de jeux SDL2 entre autres : https://www.ant01.fr

                      10 septembre 2021 à 4:47:32

                      En dehors des considérations citées plus haut, il y a quelques autres erreurs dans le code:
                      + le return n'est pas à la bonne place dans la fonction
                      + le type du tableau n'est pas mentionné dans les paramètres
                      + somme n'est pas initialisé
                      + le tableau est initialisé à l'exécution, ce n'est pas une erreur mais une mauvaise pratique.
                      (avec std::vector ça peut avoir un certain sens si on fait un push_back)
                      + on se demande pourquoi on refait la somme encore sans initialiser la somme à 0 ...
                      + est-ce voulu que la somme partielle soit affichée dans la boucle?
                      J'aurais personnellement préféré std::array à std::vector et avec un type int si on ne gère que des entiers.
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        14 septembre 2021 à 17:16:33

                        PierrotLeFou a écrit:

                        + le tableau est initialisé à l'exécution, ce n'est pas une erreur mais une mauvaise pratique.
                        (avec std::vector ça peut avoir un certain sens si on fait un push_back)

                        Les VLA ne font pas partis de la norme C++, et certains compilateurs se feront une joie de cracher une erreur.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          14 septembre 2021 à 17:40:34

                          Je n'ai pas parlé de VLA. Si on ne sait pas la longueur du tableau à l'avance, il vaut mieux utiliser std::vector avec push_back
                          Sinon on peut faire:
                          std::array<int, 3> = {15, 10, 45};
                          • Partager sur Facebook
                          • Partager sur Twitter

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

                          Passer un tableau en fonction

                          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                          • Editeur
                          • Markdown