Partage
  • Partager sur Facebook
  • Partager sur Twitter

Compréhension du cours de C++

Chapitre: Manipulez des tableaux dynamiques

    13 mai 2023 à 14:21:11

    Bonjour,

    Je passe sur ce forum car je suis actuellement le cours d'Openclassroom pour apprendre le C++.

    Jusque qu'a présent tout va bien mais il y a un point que je n'ai pas compris concernant les tableaux dynamique en C++.

    Je cite le contenu du cours:

    vector<int> tableau(5,4); //Un tableau de 5 entiers valant tous 4
    int const taille(tableau.size());
    //Une variable qui contient la taille du tableau
    //La taille peut varier mais la valeur de cette variable ne changera pas
    //On utilise donc une constante
    //À partir d'ici, la constante 'taille' vaut donc 5

    Malgré le commentaire je ne comprends pas qu'une valeur sencée changée pendant l'éxécution du programme soi ici initialisé comme une constente.
    Donc ça me semble flou pour l'instant malgré l'explication. Si quelqu'un sait m'expliquer ceci?

    Merci.

    • Partager sur Facebook
    • Partager sur Twitter
      13 mai 2023 à 14:54:34

      La variable taille récupère la taille du tableau, et elle est déclarée const. Par exemple si plus loin tu écris: taille=2; ça sera refusé. taille est bien une constante, elle ne changera jamais de valeur. Quant au tableau, il peut vivre sa vie et donc sa taille peut changer mais taille représentera toujours la taille qu'avait le tableau à la ligne 2.
      • Partager sur Facebook
      • Partager sur Twitter

      En recherche d'emploi.

        13 mai 2023 à 16:55:37

        D'accord merci, mais vu que c'est un tableau dynamique, sa taille va probablement changer en cours d'éxécution du programme. Donc la valeur de taille devra se mettre à jour en fonction de la nouvelle taille du tableau.

        Dans l'exemple ci dessus la taille est fixée à 5 au départ mais rien n'empêche que le tabeau aie une taille à 6 par la suite. Je ne saisis toujours pas comment cette constente peut se mettre à jour sur la nouvelle taille du tableau.

        • Partager sur Facebook
        • Partager sur Twitter
          13 mai 2023 à 18:09:40

          Sébastien... a écrit:

          Je ne saisis toujours pas comment cette constante peut se mettre à jour sur la nouvelle taille du tableau.

          Elle ne peut pas et ne se mettra pas à jour. Elle gardera la valeur que tu lui as donné au moment de son initialisation même si la taille du tableau change. Elle n'est pas lié à la taille tableau.

          Et même si elle avait été une variable (non constante), elle n'aurait pas changé avec le changement de taille du tableau toute seule, pour quel change, il faudrait que tu lui affectes la nouvelle taille du tableau.

          • Partager sur Facebook
          • Partager sur Twitter
          ...
            14 mai 2023 à 9:54:51

            Il y a une mauvaise compréhension de la notion d'affectation

            quand on écrit

            int c = a + b;
            

            ça "met dans c", la valeur de l'expression au moment où on passe sur l'affectation (ici c'est une déclaration avec initialisation, mais peu importe). Et la valeur y reste tant qu'on ne change pas c. Même si on change a et/ou b.

            Ceci dans les langages de programmation courants.

            Parce que dans les langages de description/simulation de hardware, comme verilog/vhdl, on aura des choses qui ressemblent syntaxiquement,  mais qui veulent dire que c est la sortie d'un additionneur dont les entrées sont reliées aux signaux a et b. Et la sortie reflète immédiatement (presque) les changements des entrées.

            Mais est-ce bien judicieux de mettre cette idée saugrenue dans la tête des débutants en C++ ?

            Bref, pour en revenir à C++, dans

            int taille = vecteur.size();
            

            taille n'est pas un "alias" qui suivrait la taille du vecteur à chaque instant.  C'est la  valeur de taille à un moment donné.


            x x x

            Ceci dit, le contenu du cours est très con.  Si on veut définir une constante pour  la taille initiale d'un vecteur, on la déclare avant

            const int TAILLE = 5;
            
            std::vector<int> v{TAILLE, 4};
            


            on part pas dans des trucs tordus qui servent à rien, à part embrouiller.  Si on veut donner des exemples, on en choisit un où le besoin est clair, et où le truc qu'on veut montrer est la meilleure solution pour y arriver.

            Je n'ai rien contre le fait qu'on puisse avoir une variable qui représente la taille d'un vecteur à un moment donné

            std:vector<int> v;
            
            ....
            // remplissage de v
            ...
            
            const int taille = v.size();
            
            

            mais dans ce cas, si on veut dire "donc on met const", il  faut dire pour quelle raison. Avoir un contexte qui justifie qu'on ne doit pas faire changer taille ensuite.



            -
            Edité par michelbillaud 15 mai 2023 à 9:48:09

            • Partager sur Facebook
            • Partager sur Twitter
              14 mai 2023 à 18:33:50

              Donc en somme dans ce chapitre du cours on parle de tableau dynamique mais finalement cette fameuse constante ne suit pas cette logique de tableau dynamique. C'est pour ça que je ne comprennais pas.

              Si par exemple on veut à plusieurs moments du programme afficher TOUT le tableau via une boucle (for) en mettant à jour la variable de taille il vaut mieux donc passer par une variable de type int simplement ou directement par la fonction .size(); sans passer par une variable.

              -
              Edité par Sébastien... 14 mai 2023 à 18:35:21

              • Partager sur Facebook
              • Partager sur Twitter
                14 mai 2023 à 19:10:19

                Il faut voir cela plutot comme "qui PEUT changer de taille", pas "qui va obligatoirement changer de taille". Et encore, il faut même plutot voir cela comme "dont la taille est determinée a l'execution" (comparé a std::array par exemple, dont la taille est determinée a la compilation). Et voir const pas comme une constante (= une valeur fixée a la compilation, par exemple avec constexpr) mais plutot comme "la valeur change plus apres l'intialisation".

                Par exemple, dans le code suivant :

                std::cin >> taille;
                const std::vector<int> v(taille, 4);

                on a bien un tableau dynamique (= la taille est connue a l'execution) mais qui est const (= le tableau ne change plus apres son initialisation).

                Ce sont des notions qui ne sont pas forcement correctement expliquée dans le cours.

                Sébastien... a écrit:

                Si par exemple on veut à plusieurs moments du programme afficher TOUT le tableau via une boucle (for) en mettant à jour la variable de taille il vaut mieux donc passer par une variable de type int simplement ou directement par la fonction .size(); sans passer par une variable.

                En réalité, si on veut faire ca, on utilisera une range-for loop :

                for (int i: v)
                    std::cout << i << std::endl;

                Plus généralement, pour parcourir un tableau, on va préférer : 

                • les range-for loops
                • les algos standards
                • les iterateurs
                • les indices avec []

                (certains mettront les itérateurs avant les algos, c'est discutable)

                Parcourir les tableaux avec des indices et [], c'est la méthode qui offre le moins de securité et qui vient du C. 

                • Partager sur Facebook
                • Partager sur Twitter
                  14 mai 2023 à 20:11:02

                  > Ce sont des notions qui ne sont pas forcement correctement expliquée dans le cours.


                  Le problème c'est d'avoir un cours (*) pour lequel on se doit se demander constamment si la difficulté de compréhension, ça viendrait pas du choix d'un mauvais exemple pour illustrer un truc qui en fait n'a pas d'intérêt (au moins immédiat, par rapport à ce qui est expliqué avant).

                  Commencer par déclarer un vector avec une taille et des valeurs initiales, c'est pas un bon truc pour le début. C'est mieux de commencer par déclaration d'un vecteur vide, push_back (le caractère extensible du truc), accès par indice et size.  Les opérations fondamentales.

                  La déclaration d'un vecteur avec répétition d'une valeur initiale, c'est du supplément certes utile, mais pas immédiatement. Parmi plein d'autres choses. Et l'histoire du const n'a rien à fiche là dedans.


                  https://openclassrooms.com/fr/courses/1894236-apprenez-a-programmer-en-c/7711021-manipulez-des-tableaux-dynamiques

                  (*) normalement, un cours, on le présente à des apprenants, et on le met à jour en tenant compte des retours, quand on voit que certains trucs sont pas bien compris.
                  et un cours consacré à un langage de programmation, on le met à jour en fonction de l'évolution.

                  -
                  Edité par michelbillaud 14 mai 2023 à 20:28:07

                  • Partager sur Facebook
                  • Partager sur Twitter
                    14 mai 2023 à 20:17:35

                    En C++, les notions de compile time et runtime, de constexpr et const, sont quand meme importante. Mais ce sont des notions qui avaient moins d'importance a l'epoque oú ce cours a ete ecrit (tant qu'on ne faisait pas de template).
                    • Partager sur Facebook
                    • Partager sur Twitter
                      15 mai 2023 à 9:32:50

                      Dans ce cours, const est expliqué plus tôt, avec la recommandation de l'utiliser systématiquement. Très bien.

                      Ce que l'auteur du cours ne fait absolument pas ensuite.

                      ---

                      La tendance actuelle est de déclarer et initialiser les variables au plus tard, juste quand on en a besoin, et qu'on est capable de leur donner une valeur initiale significative. Et de mettre const si la valeur n'est pas censée être modifiée.

                      Ce qui arrive souvent, et du coup, en rust par exemple, il faut mettre explicitement mut pour déclarer une variable (mutable) plutôt qu'une constante.

                      A l'epoque C++ était une extension de C, et donc tous les trucs par défaut sont dans le mauvais sens

                      ----

                      Ça me rappelle un vieux (et très mauvais) bouquin d'exercices Fortran 77, recommandant d'indenter les programmes en donnant un exemple. Et il ne le faisait pas. Et donnant des solutions sous forme de reproductions de listings, pour faire sérieux. De codes sources qui marchaient pas.

                      Le tout publié par une maison se présentant comme "éditeur scientifique"

                      -
                      Edité par michelbillaud 15 mai 2023 à 9:46:24

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Compréhension du cours de 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