Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours C++

Différences entre les versions de C++

    17 novembre 2016 à 14:07:43

    Bonjour,

    Voilà maintenant plus d'1 semaine que je passe mes journées à apprendre le C++ grâce au cours d'OpenClassrooms. J'en suis arrivé à la partie 3, c'est-à-dire à Qt. Cependant, hier soir je suis tombé sur un topic affirmant que le "cours" d'OC était complètement obsolète. Trouvant ça bizarre je me suis renseigné plus en détails et je suis tombé sur de nombreux sujets parlant de ce problème. Alors oui vous me direz que du coup c'est un sujet qui est revenu plusieurs fois, et sur plusieurs sites, je vous l'accorde. J'ai trouvé 3/4 livres de références pour apprendre le C++ à vous avoir lu. Le problème est que depuis avoir lu autant d'avis négatif sur ce cours je n'ai plus l'envie de le continuer.

    En survolant (j'ai bien dit en survolant !) le cours de C++ de gbdivers, qui se veut "moderne, je ne voit pas vraiment la différence hormis les accolades {} au lieu des parenthèses () pour la déclaration de variables.

    J'ai donc une question qui va sans doute ne pas être nouvelle comme j'ai déjà lu des sujets s'en rapprochant mais bon.. D'après vous, ce cours que propose OC, est-il si obsolète que ça ? J'ai cru entendre parler de pointeur intelligent qui sont beaucoup plus simple à utiliser mais avant d'utiliser ce genre de chose, n'est-il pas recommandé de savoir concrètement ce que cette chose signifie ?

    Quelles sont les différences entre ce que nous apprend OC et les versions de nos jours ? Sont elles nombreuses et importantes ?

    J'espère ne rien avoir oublié et merci d'avance pour les réponses.

    Ewan

    • Partager sur Facebook
    • Partager sur Twitter
    "J'aime parler de rien, c'est le seul domaine où j'ai de vague connaissances." - Oscar Wilde
      17 novembre 2016 à 14:24:04

      Kentena a écrit:

      En survolant (j'ai bien dit en survolant !) le cours de C++ de gbdivers, qui se veut "moderne, je ne voit pas vraiment la différence hormis les accolades {} au lieu des parenthèses () pour la déclaration de variables.

      C'est que tu ne t'es penché que sur le début. Et que tu n'as pas lu une bonne partie. Rien que les littérales, ça fait du boulot, et le cours d'OC n'en parle pas. On ajoute également l'inférence de type (qui est cruciale), les const-expression, les énumérations fortement typées, les regex, ... Et là, on n'a pas encore attaqué le concept de classe.

      Kentena a écrit:

      J'ai donc une question qui va sans doute ne pas être nouvelle comme j'ai déjà lu des sujets s'en rapprochant mais bon.. (1) D'après vous, ce cours que propose OC, est-il si obsolète que ça ? (2) J'ai cru entendre parler de pointeur intelligent qui sont beaucoup plus simple à utiliser mais avant d'utiliser ce genre de chose, n'est-il pas recommandé de savoir concrètement ce que cette chose signifie ?

      (1) Oui, mais ce n'est pas le principal problème. Le vrai problème c'est que les exemples du "cours" sont majoritairement faux et apprennent à faire de grosses conneries avec les classes. La partie Personnage et compagnie, c'est juste n'importe quoi quasiment d'un bout à l'autre et pareil pour le polymorphisme.

      (2) Ce que ça signifie ? Ben c'est simple à expliquer :

      • std::unique_ptr : une variable de ce type pointe vers une ressource dont elle est propriétaire unique et la libère quand elle arrive en fin de vie,
      • std::shared_ptr : une variable de ce type pointe vers une ressource dont la propriété peut être partagée avec d'autre shared_ptr, quand elle arrive en fin de vie, si elle est le dernier propriétaire elle libère la ressource.

      De quoi as-tu besoin de plus ? Si tu utilises malloc en C, tu n'as pas besoin qu'on t'explique comment fonctionne la hiérarchie des pages de données en mémoire, la MMU, le TLB, les flush des caches et tout le reste. Si ? Quand tu codes en Python, tu n'as pas besoin de comprendre toute la mécanique d'allocation de ton interpréteur pour l'utiliser correctement. Si ?

      Que comprends tu de plus quand tu appelles new et que tu oublies de gérer les exceptions ? Parce que oui, sans savoir ce que sont les exceptions, il y a 98% de chance que ton code qui contient des new soit faux. Je te conseille de jeter un oeil au "cours" d'OC pour voir où sont introduites les exceptions.

      Kentena a écrit:

      Quelles sont les différences entre ce que nous apprend OC et les versions de nos jours ? Sont elles nombreuses et importantes ?

      Principalement la focalisation de l'usage des ressources vers le RAII et donc le bon usage des conteneurs de la SL, et ça fait pour ainsi dire tout. On pourra ajouter les histoires de constexpr etc. Mais comme dit précédemment, les plus gros problèmes sont dans les conneries de conception.

      -
      Edité par Ksass`Peuk 17 novembre 2016 à 14:25:43

      • Partager sur Facebook
      • Partager sur Twitter

      Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

        17 novembre 2016 à 14:40:13

        Merci Ksass`Peuk. Tu fait notamment partie de ceux que j'ai pu pas mal lire avec gbdivers.

        Tes explications sont claires, surtout au niveau des pointeurs. D'ailleurs j'ai compris, enfin je pense, à la première lecture ce qu'était les unique_ptr et les shared_ptr. En vrai tu as sans doute raison et tu m'a en partie convaincu, pourquoi vouloir apprendre à faire des choses compliquées dont on a fait exprès de créer des fonctions pour ne plus avoir à le faire. Mais une partie de moi pense tout de même à l'exemple des matières scientifique. J'ai vite compris qu'en apprenant d'où viennent les choses, c'est à dire en apprenant à démontrer, on s'en sort beaucoup mieux après. Cela n'empêche que tu me fait prendre conscience que la programmation n'est pas des maths et que ce n'est sans doute pas vrai pour ceci du coup.

        En revanche, y a juste tes 3 dernières lignes que j'ai du mal à saisir. Mais je vais me renseigner sur les acronymes que tu as employé.

        Pour finir, ça m'embête énormément car je sais que je vais relire la même chose à certains endroits, surtout le début.. Mais de toute manière j'ai quelques années avant de savoir coder donc autant y aller doucement tant pis. gbdivers j'arrive !

        • Partager sur Facebook
        • Partager sur Twitter
        "J'aime parler de rien, c'est le seul domaine où j'ai de vague connaissances." - Oscar Wilde
          17 novembre 2016 à 15:06:47

          Kentena a écrit:

          (1) Mais une partie de moi pense tout de même à l'exemple des matières scientifique. J'ai vite compris qu'en apprenant d'où viennent les choses, c'est à dire en apprenant à démontrer, on s'en sort beaucoup mieux après. (2) Cela n'empêche que tu me fait prendre conscience que la programmation n'est pas des maths et que ce n'est sans doute pas vrai pour ceci du coup.

          (1) Tu as besoin de comprendre ce que sont les monoïdes pour utiliser correctement l'addition et la multiplication ? Tu as besoin de savoir faire de connaître les théories du monde quantique pour faire de la chimie ou pour manipuler des formules sur les circuit électrique ? Dans tous les domaines, on admet des axiomes de bases et des formules de bases sans en connaître les démonstrations précises. Je ne pense pas qu'au collège on se mange la démonstration du théorème de Thalès par exemple, ou celle des angles alternes/internes. Même si on utilise leur propriétés. Plus important, personne ne s'attaque à la démonstration que 1+1=2.

          (2) Sur certains points c'est plus que des maths sur certains point moins. Mais je peux t'assurer que selon comment tu la vois l'informatique peut vraiment être des maths.

          Kentena a écrit:

          En revanche, y a juste tes 3 dernières lignes que j'ai du mal à saisir. Mais je vais me renseigner sur les acronymes que tu as employé.

          Pour finir, ça m'embête énormément car je sais que je vais relire la même chose à certains endroits, surtout le début.. Mais de toute manière j'ai quelques années avant de savoir coder donc autant y aller doucement tant pis. gbdivers j'arrive !

          RAII : Resource Acquisition Is Initialization

          SL : Standard Library

          Pour le cours, si tu veux quelque chose de peut être un peu moins à jour mais de très bon et déjà complet, il y a le C++ Primer 5th edition de Lippman.

          • Partager sur Facebook
          • Partager sur Twitter

          Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

            17 novembre 2016 à 15:11:22

            Justement, je trouve que ton analogie ne va pas dans le bon sens.

            Comme en science ou en maths, il faut y aller étape par étape, en creusant un peu plus une fois que tu as compris quelque chose.

            Par exemple, étant petit, tu as appris à additionner des nombres entiers de la façon la plus intuitive possible et après tu as construit tes maths la dessus sans jamais avoir besoin de voir les axiomes de Peano, de théorie des ensembles ou autre, et la plupart des gens ne le feront jamais.

            Bah pour les pointeurs et la mémoire c'est pareil, tu peux très bien devenir un bon programmeur sans jamais gérer la mémoire à la main.

            Seuls dans quelques cas très précis et spécifiques pourrais-tu en avoir besoin, tu peux très bien t'y intéressé pour améliorer ta culture de prog dans des petits exos pour toi, mais ne pas en avoir besoin dans tes études / ton travail (sauf si tu tombe sur de mauvais profs / collègues).

            D'autant plus que la SL (Standard Library) t'offre plein de ressource pour te simplifier la vie, et d'autres bibli comme boost en propose des plus rares pour des cas spécifiques, déjà rien que ces deux là doivent couvrir 99% de tes besoins haut la main^^

            • Partager sur Facebook
            • Partager sur Twitter
              18 novembre 2016 à 10:57:42

              salut,depuis deux semaine j'apprends le C++ et je suis sur un projet de création d'une DLL intitulé voiture.ma DLL doit avoir les fonctions de base d'une voiture pendant ma recherche je me suis rendu compte que je dois utiliser des fonctions amies et appliquer la notion d’héritage,mais depuis je traine le pas.je ne sais si c'est un problème de programmation ou c'est moi qui ne comprend pas bien le problème. merci de m'apporter votre aide
              • Partager sur Facebook
              • Partager sur Twitter
                18 novembre 2016 à 11:00:58

                Quel est le rapport avec le présent sujet ?

                • Partager sur Facebook
                • Partager sur Twitter

                Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                  18 novembre 2016 à 11:02:22

                  Ksass`Peuk a écrit:


                  (2) Sur certains points c'est plus que des maths sur certains point moins. Mais je peux t'assurer que selon comment tu la vois l'informatique peut vraiment être des maths.

                  Ca dépend évidemment de ce qu'on appelle "faire des maths", mais sinon, dans la programmation, dès qu'on programme une boucle, on est en train de faire un raisonnement par récurrence



                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 novembre 2016 à 11:06:19

                    michelbillaud a écrit:

                    Ca dépend évidemment de ce qu'on appelle "faire des maths", mais sinon, dans la programmation, dès qu'on programme une boucle, on est en train de faire un raisonnement par récurrence

                    J'espère que tu ne dis pas ça aux débutants en informatique, eux qui sont si heureux de ne plus faire de maths :lol: .

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Posez vos questions ou discutez informatique, sur le Discord NaN | Tuto : Preuve de programmes C

                      18 novembre 2016 à 11:30:46

                      Fatalement, y a bien un moment où je me laisse aller à évoquer le raisonnement formel sur les programmes, genre "instructions vues comme transformateurs de prédicats". On ne se refait pas.

                      Mais bon, c'est de façon informelle. Pour ceux qui ne connaissent pas :

                      • le prédicat en question, c'est une description d'une situation à un moment donné. Une affirmation du genre "à ce moment-là, à cet endroit du programme, dans   s  il y a la somme  t[0] + t[1] + .... t[i]
                      • si cette affirmation (je note assert( s == t[0] + t[1] + ... t[i])  pour faire joli) vient après l'instruction s = s +t[i], c'est qu'avant ça, je savait que dans s il y a la somme   jusqu'à t[i-1] : assert (s= = t[0] + t[1] + ... t[i-1])
                      assert( s == t[0]+t[1]+....t[i-1] );        // 2
                      s = s+t[i];

                       et puis on remarque l'assertion 2 s'obtient tout bêtement en prenant la 1, et en remplaçant s  par s + t[i]

                      assert( s == t[0]+t[1]+....t[i-1]+t[i]);    // 1
                      
                      // en remplaçant
                      
                      assert( s+t[i] == t[0]+t[1]+....t[i-1]+t[i]);
                      
                      // et en simplifiant, paf
                       
                      assert( s      == t[0]+t[1]+....t[i-1]      ); // 2
                      

                       Bref, l'instruction s=s+t[i] transforme 2 en 1 (en marche arrière). 2 est vrai après si 1 est vrai avant.

                      On voit aussi que, si on remplace i par i+1 dans 2, on retombe sur 1

                      Donc ça a quelque chose à voir sur le fait que les prédicats 1 et 2 "se tiennent entre eux" dans la boucle

                      while (....) {
                         // 2
                         s = s+t[i];
                         // 1
                         i = i + 1
                         // 2
                      }

                      Le tout étant que // 2 soit vrai au départ. Ce qui est le cas si i=0 (somme vide) et s=0. et puis alors (récurrence), quand on sortira de la boucle, 2 sera vrai.

                      En général, i aura dépassé le dernier indice, donc dans s il y aura la somme de tous les éléments de t

                      Comme quoi on y arrive.

                      -
                      Edité par michelbillaud 18 novembre 2016 à 11:37:22

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Cours 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