La programmation en C++ moderne

Apprenez la programmation de zéro jusqu'à l'infini !

a marqué ce sujet comme résolu.

Salut à tous,

Quelques corrections éparses et la finalisation du chapitre sur les templates composent le menu de cette bêta. Le mieux étant l’ennemi du bien, je pense qu'on va partir sur une validation du tutoriel à ce stade. Bien entendu, nous sommes toujours ouverts à vos remarques et suggestions. :)

Merci d’avance pour vos commentaires.

Hello,

§ Template

a- J’ai toujours mal avec la traduction de termes techniques vers des termes plus génériques, voir pseudo-interchangeables en français. Ici "template" qui devient "patron" ou "modèle". Pour info, "template" vient du vieux François "templet". Je pinaille.

b- La saisie sécurisée peut partir en boucle infinie sur une fermeture de std::cin. Même sans ^D (ou ^Z sous Windows), on y arrive vite avec un ./executable < fic_de_test où le fichier de test est corrompu.

c- "sans effort ni difficulté", quand le machin derrière "sans" peut exister en nombre > 1, le machin doit prendre la marque du pluriel — le chevalier reste donc "sans tête", mais je mettrais bien un 's’ à "effort" et à "difficulté"

d- Je me pose la question de faire le rapprochement avec les paramètres de fonctions qui peuvent être réels ou formels. C’est la même chose avec les templates.

e- Je séparerai le 101 de la méta-prog de la déclaration de classes et de fonctions template. Dans ce 101: spécialisations templates, surcharges, classes de traits, politiques, et éventuellement la base de la résolution à la Prolog/XSLT et/ou les récursions à la LISP — étape d’après, SFINAE, listes de types, etc etc.

Je laisserai de côté la spécialisation de fonctions templates (surtout que l’on préfère souvent la surcharge) pour l’instant.

f- Il ne m’a pas semblé voir le rappel élémentaire que l’on a déjà manipulé des choses templates: les collections standards, quelques algos standards, etc. Et que le but du chapitre est d’initier à l’écriture de ces choses.

EDIT: Pénible la règle anti-flood

§ erreur

a- "sqrt […] attends". Pas de "s" à "attend"

b- le contrat de sqrt va plus loin: je vrai de renvoyer un nombre positif que si tu le multiplies par lui-même, tu retrouveras ton nombre de départ, à un epsilon près.

c- Tout ceci me rappelle ma relecture du cours du sdz/oc à la veille du C++11. Les contrats ont été validés pour le C++20. Ne faudrait-il pas un petit mot pour dire que le C++20 offrira de nouveaux outils à ce sujet?

Merci pour tes retours. :)

a - C’est plus pour montrer que des termes français existent. Majoritairement, on utilise le mot template après.

b - Comment s’en prémunir alors ?

c - À vérifier. Pour moi, comme sans signifie rien du tout, zéro, ça me paraissait logique de mettre au singulier.

e - Je ai pas compris ce 101.

f - On a mis un sous-titre sur la bibliothéque standard qui en regorge. Ça vaut sans doute le coup de rendre ça plus explicite.

NB: j’ai édité mon message entre temps.

I.b- J’ai déjà donné le code dans la FAQ de dvpz ;) https://cpp.developpez.com/faq/cpp/?page=Manipulation-de-la-console#Comment-verifier-les-valeurs-saisies-avec-cin

I.c- https://www.btb.termiumplus.gc.ca/tpv2guides/guides/clefsfp/index-fra.html?lang=fra&lettr=indx_catlog_s&page=9IpCybX6e3yc.html Tiens, on dirait qu’il y a des exceptions à la règle que j’avais zappées

I.e- Je trouvais prématuré de parler de la spécialisation de fonction template sans avoir creusé plus la définition de classe template. Je range la spécialisation template dans les chapitres de meta-prog habituellement.

Merci pour cin. Effectivement, on ne prend paas en compte la fin du fichier. Je vais voir où et comment introduire ça. Dans le chapitre sur les flux ? Dès le premier T.P ? À voir.

Concernant toutes les nouveautés de C++20, on compte bien mettre le cours à jour. On pourrait en parler maintenant, mais du coup, ça implique que certains pourront compiler et d’autres non. Puis il faut aussi que je regarde tout ce qui est prévu, pour savoir les chapitres qui doivent être mis à jour.

Si j’y pense, c’est à cause de la sortie du livre des Matthieu. Quand je relisais, le C++11 arrivait, ou venait d’arriver, mais le choix a été fait de rester dans la norme précédente. Et là ont plu les "c’est obsolète" & cie, dès la sortie.

Le C++20 est dans 2 ans, certes. Le tuto est fini si j’ai bien compris. C’est pour ça qu’une note pourrait suffire "le C++20 offrira un autre moyen plus propre pour exprimer des contrats, nous en reparlerons dans des prochains tutos dédiés, ou lors d’une future mise à jour de ce tuto". Pas besoin de plus.

Je survole la question dans mon 2e billet sur le PpC sur tu veux voir la syntaxe. Il y a eu pas mal de billets depuis que les gens commencent à comprendre la bestiole: http://luchermitte.github.io/blog/2014/05/28/programmation-par-contrat-les-assertions/#iii—le-standard-senrichira-t-il-en-2014-ou-en-201

Mais pas besoin de rentrer dans les détails pour l’instant.

Merci encore pour tes retours. Je reviens sur le point e).

e) Je laisserai de côté la spécialisation de fonctions templates (surtout que l’on préfère souvent la surcharge) pour l’instant.

Là, j’avoue que je ne sais pas pourquoi. J’ai essayé de me renseigner sur Internet, mais je n’ai pas trouvé de réponse claire. Du coup, pourquoi ?

c- "sans effort ni difficulté", quand le machin derrière "sans" peut exister en nombre > 1, le machin doit prendre la marque du pluriel — le chevalier reste donc "sans tête", mais je mettrais bien un 's’ à "effort" et à "difficulté"

On en apprend tous les jours grâce à Quipoquiz !

d- Je me pose la question de faire le rapprochement avec les paramètres de fonctions qui peuvent être réels ou formels. C’est la même chose avec les templates.

J’ai pas bien compris ce que tu veux dire.

e- Je séparerai le 101 de la méta-prog de la déclaration de classes et de fonctions template. Dans ce 101: spécialisations templates, surcharges, classes de traits, politiques, et éventuellement la base de la résolution à la Prolog/XSLT et/ou les récursions à la LISP — étape d’après, SFINAE, listes de types, etc etc.

Je laisserai de côté la spécialisation de fonctions templates (surtout que l’on préfère souvent la surcharge) pour l’instant.

lmghs

Je suis d’accord. La surcharge suffit pour un débutant. Ce que j’ai proposé à @informaticienzero, c’est qu’on mettra une partie notions avancées à la fin du cours, avec un chapitre d’introduction à la méta-programmation template notamment.

c- Tout ceci me rappelle ma relecture du cours du sdz/oc à la veille du C++11. Les contrats ont été validés pour le C++20. Ne faudrait-il pas un petit mot pour dire que le C++20 offrira de nouveaux outils à ce sujet?

lmghs

Nooooon ! Compare-nous à tout sauf à ça !! ^^

+0 -0

I.b- J’ai déjà donné le code dans la FAQ de dvpz ;) https://cpp.developpez.com/faq/cpp/?page=Manipulation-de-la-console#Comment-verifier-les-valeurs-saisies-avec-cin

lmghs

J’ai tant de fois béni cette FAQ quand je débutais en C++ (et même après avoir acquis un certain niveau !) ! Je ne savais pas que tu y avais contribué. Du coup, merci beaucoup, avec quelques années de retard ! ^^

Après, le but étant d’apprendre le C++ moderne, on va le mettre à jour en conséquence. ;)

informaticienzero

Certes, on va essayer de mettre à jour le tuto à chaque standard. Mais pour moi, le plus important dans un cours de C++ moderne, c’est d’inculquer une certaine mentalité moderne du développement en C++, c’est à la limite pas très grave si on n’est pas parfaitement à jour sur le standard.

Le C++ moderne, c’est avant tout une mentalité.

+0 -0

d- Je me pose la question de faire le rapprochement avec les paramètres de fonctions qui peuvent être réels ou formels. C’est la même chose avec les templates.

lmghs

J’ai pas bien compris ce que tu veux dire.

mehdidou99

C’est une question de formalisme qui n’a pas été posé, et je n’ai pas vu de parallèle clair avec les fonctions pour dire: "dans une fonction on a(vait) les paramètres (dits formels) que l’on manipule dans la fonction, et les paramètres avec lesquels on appelle la fonction (dit paramètres réels). Et bien, avec les templates, c’est pareil. Quand vous utilisez vector<int>, int est le paramètre (qui est un type) réel avec lequel le type template vector est instancié, mais pour définir la classe vector, un paramètre formel est utilisé, etc, etc".

Est-ce que cela va aider l’apprenant à faire le parallèle et la transition en douceur? Est-ce que cela va le parasiter avec des notions qu’il n’a pas besoin de repérer? Je ne sais pas.

c- Tout ceci me rappelle ma relecture du cours du sdz/oc à la veille du C++11. Les contrats ont été validés pour le C++20. Ne faudrait-il pas un petit mot pour dire que le C++20 offrira de nouveaux outils à ce sujet?

lmghs

Nooooon ! Compare-nous à tout sauf à ça !! ^^

mehdidou99

Hé hé. C’est justement pour éviter la comparaison que j’anticipe ;)

I.b- J’ai déjà donné le code dans la FAQ de dvpz ;) https://cpp.developpez.com/faq/cpp/?page=Manipulation-de-la-console#Comment-verifier-les-valeurs-saisies-avec-cin

lmghs

J’ai tant de fois béni cette FAQ quand je débutais en C++ (et même après avoir acquis un certain niveau !) ! Je ne savais pas que tu y avais contribué. Du coup, merci beaucoup, avec quelques années de retard ! ^^

mehdidou99

Avec plaisir :) Depuis le temps j’ai contribué à divers trucs.

Après, le but étant d’apprendre le C++ moderne, on va le mettre à jour en conséquence. ;)

informaticienzero

Certes, on va essayer de mettre à jour le tuto à chaque standard. Mais pour moi, le plus important dans un cours de C++ moderne, c’est d’inculquer une certaine mentalité moderne du développement en C++, c’est à la limite pas très grave si on n’est pas parfaitement à jour sur le standard.

Le C++ moderne, c’est avant tout une mentalité.

mehdidou99

C’est une mentalité c’est vrai. Trop souvent il y a, je trouve, confusion avec le fait d’utiliser certains artefacts de syntaxe comme les {} pour initialiser, etc.

C’est une question de formalisme qui n’a pas été posé, et je n’ai pas vu de parallèle clair avec les fonctions pour dire: "dans une fonction on a(vait) les paramètres (dits formels) que l’on manipule dans la fonction, et les paramètres avec lesquels on appelle la fonction (dit paramètres réels). Et bien, avec les templates, c’est pareil. Quand vous utilisez vector<int>, int est le paramètre (qui est un type) réel avec lequel le type template vector est instancié, mais pour définir la classe vector, un paramètre formel est utilisé, etc, etc".

Est-ce que cela va aider l’apprenant à faire le parallèle et la transition en douceur? Est-ce que cela va le parasiter avec des notions qu’il n’a pas besoin de repérer? Je ne sais pas.

lmghs

Je note, à méditer.

Et si on fait bien le boulot niveau mentalité et bonnes pratiques, la mise à jour vers C++20 ne sera qu’un formalisme. ;)

informaticienzero

Ce sera donc une formalité d’introduire ce nouveau formalisme. ^^

EDIT : En fait c’est mieux qu’à méditer : c’est une bonne idée. C’est validé, je le mettrai.

+0 -0

C’est une question de formalisme qui n’a pas été posé, et je n’ai pas vu de parallèle clair avec les fonctions pour dire: "dans une fonction on a(vait) les paramètres (dits formels) que l’on manipule dans la fonction, et les paramètres avec lesquels on appelle la fonction (dit paramètres réels). Et bien, avec les templates, c’est pareil. Quand vous utilisez vector<int>, int est le paramètre (qui est un type) réel avec lequel le type template vector est instancié, mais pour définir la classe vector, un paramètre formel est utilisé, etc, etc".

Est-ce que cela va aider l’apprenant à faire le parallèle et la transition en douceur? Est-ce que cela va le parasiter avec des notions qu’il n’a pas besoin de repérer? Je ne sais pas.

lmghs

J’entends plus souvent les termes "paramètres" (paramètres formels) et "arguments" (paramètres réels ou effectifs).

Il est important que le lecteur fasse la distinction entre code appelant et code appelé. Un petite note en plus pour préciser les termes est suffisant a mon avis.

+0 -0

J’entends plus souvent les termes "paramètres" (paramètres formels) et "arguments" (paramètres réels ou effectifs).

gbdivers

C’est la terminologie qu’on utilise dans le cours d’ailleurs.

Il est important que le lecteur fasse la distinction entre code appelant et code appelé. Un petite note en plus pour préciser les termes est suffisant a mon avis.

gbdivers

Je suis d’accord. On le fait déjà pour les fonctions, on va l’ajouter pour les paramètres templates. Le parallèle est intéressant à mentionner rapidement.

+0 -0

La norme et beaucoup de docs anglais utilisent "parameter" et "argument". J’ai une petite préférence pour les autres qui sont plus simples à caser dans une explication en français — et qu’il est plus difficile de confondre (je dois toujours me poser un moment pour paramètre et argument)

  • les uns sont ce qui est réellement passé en paramètre à la fonction
  • les autres servent à exprimer formellement ce que fait la fonction

Bonjour les agrumes !

La bêta a été mise à jour et décante sa pulpe à l’adresse suivante :

Au programme, quelques corrections éparses, et la rédaction du début d’un nouveau chapitre introduisant de nouvelles structures de données utiles. Ce chapitre vient préparer l’arrivée d’un chapitre-TP, qui sera constitué d’un exercice plus conséquent que ce qui a été fait jusque-là, pour réutiliser un peu tout.

Merci d’avance pour vos commentaires.

+0 -0

(Pressé comme un citron, je passe en coup de vent ;)

a- je pinaille juste sur le format du fichier. Dans un csv, j’aurai plutôt vu nom;prenom;age;sexe. Le format choisi me fait plus penser à un pseudo-YAML, ou .properties à cause du balisage.

b- s/InfosPersos/InfosPersonne ? -> Informations d’une personne. Ou alors InformationsPersonnelles

c-

La convention veut que l’on nomme les structures en commençant chaque mot composant l’identifiant par une majuscule.

-> La convention que nous avons choisie dans ce cours.

La SL fait tout son possible pour ne pas suivre cette convention, et Stroustrup râle déjà (si j’ai bien suivi ces dernières interventions) que les concepts soient en UpperCamelCase au lieu du snake_case.

d- La notion de saisie sécurisée ne me parait pas avoir de sens sur une chaîne de caractères. La seule invalidation possible survient sur un flux fermé, chose que la fonction ne teste pas.

e- + "."s -> + '.'?

f- J’enchainerai de suite de

InfosPersos infos{};
demander_infos(infos);

à

auto infos = demander_infos();

qui est le style multiplement recommandé, et ce avant même de parler des tuples.

g- Question que je me pose. On sait que performances-wise, les unordered_map sont largement supérieures aux map. Mais elles demandent beaucoup plus de choses à taper. Qu’est-ce qui est le plus pertinent pour un débutant? Un truc simple à taper et fonctionnel? Ou un truc que l’on se doit de préférer 90% du temps en industrie (IOW, l’idiome)? On est sur un débat équivalent à celui list VS vector.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte