Mise à jour de la FAQ C :
Avec désormais 181 réponses à vos questions, pour mieux apprendre le langage C
Le 2017-02-19 02:26:35, par Malick, Community Manager
Chers membres du club,
j'ai l'immense plaisir de vous annoncer la mise à jour de la FAQ C avec une sélection des cent quatre-vingt-une meilleures réponses à vos questions pour apprendre la programmation avec ce langage.
Les nouveaux Q/R portent essentiellement sur les nouveautés de C11 par rapport à C99.
Le chargement des données d'un fichier texte dans une structure
Ce nombre est appelé à évoluer avec vos différentes contributions.
Nous remercions LittleWhite, Matt_Houston et Winjerome pour leur engagement dans la rédaction et la relecture technique. Nos reconnaissances également à Claude LELOUP pour les corrections orthographiques.
j'ai l'immense plaisir de vous annoncer la mise à jour de la FAQ C avec une sélection des cent quatre-vingt-une meilleures réponses à vos questions pour apprendre la programmation avec ce langage.
Les nouveaux Q/R portent essentiellement sur les nouveautés de C11 par rapport à C99.
- Qu’est-ce que le C11 ?
- Quel est l'état du support de la norme C11 par les compilateurs ?
- Quelles sont les nouveautés de C11 ?
- Qu’est-ce que l’alignement mémoire ?
- Qu’est-ce que le multithreading ?
Le chargement des données d'un fichier texte dans une structure
Ce nombre est appelé à évoluer avec vos différentes contributions.
Nous remercions LittleWhite, Matt_Houston et Winjerome pour leur engagement dans la rédaction et la relecture technique. Nos reconnaissances également à Claude LELOUP pour les corrections orthographiques.
Vous pouvez aussi contacter l'équipe de rédaction
. -
sambia39Membre expérimentéBonsoir
Dans la section FAQ C Comment charger les données d'un fichier texte dans une structure ? pourquoi utiliser un assert ?
Enfin (rien ne vous oblige), mais personnellement, je trouve qu’il n’est pas correct d’utiliser assert dans le cas présent surtout si l’objectif du FAQ est de fournir une réponse correspondant la questions récurrentes posées.
Je suis d’avis à connaître la raison d’un échec d’appel d’une fonction, mais de là a utilisé une fonction qui a pour rôle ou un des rôles la détection d’erreur de programmation lors de débogage et interrompre le programme en renvoyant une terminaison anormale du programme en question; est excessive.
Je pense qu’il est préférable d’utiliser un retour d’erreur que assert. Je m’explique : le retour d’erreur met en évidence une mauvaise utilisation de la fonction à cause d’un paramètre erroné (Exemple à cause d’une ouverture de fichier qui a échoué, ou autres, etc..), ce qui permet alors de prendre les mesures nécessaires pour traiter l’erreur et terminer le programme proprement.
"assert" est utilisé (dans mon cas) quand on se rend compte de l’instabilité du programme ou lorsque l’on fait du débogage en clair "assert" doit être utilisé que pour des circonstances ne devant jamais ce produire durant l’exécution normale d’un programme c’est un outil de débogage et non une méthode, routine ou fonction de sortie d’erreur de plus la gestion d’erreur doivent impérativement être faites uniquement par le programme Dans l’exemple fournir il ne s’agit strictement pas d’un bogue..
Admettant que l’on compile avec -DNDEBUG pensez-vous que le programme final soit correct (et portable) ?.
Ceci dit la mise à jour de la FAQ était essentielle
à bientôtle 20/02/2017 à 19:02 -
picodevMembre émériteBonjour,
concernant les «implémentations» complètes de C11 il faut citer les couples compilateurs/bibliothèque standard.
Le couple gcc/musl est une implémentation de C11, au même titre que gcc/glibc (aux threads près si je ne me trompe pas).
En tout cas bravo pour la mise à jour qui était nécessairele 19/02/2017 à 18:27 -
Matt_HoustonExpert confirméEffectivement l'assert ne devrait pas être utilisé pour traiter un échec de fopen, bien vu sambia.
Je ne suis pas totalement d'accord - c'est mineur, mais la FAQ C est précisément l'endroit pour chipoter ! - avec la solution de remplacement proposée par picodev :
Ce qui me chiffonne c'est l'usage d'exit : il n'y a pas de raison de « paniquer » ici, de plus nous sommes dans main où l'on peut lui préférer un simple et élégant return. On voit déjà cet appel utilisé à tort et à travers dans les programmes de débutants, autant ne pas encourager cette pratique.
Ça c'est plus une préférence personnelle mais je ne suis pas non plus d'avis d'user et abuser de cette syntaxe, certes souvent pratique mais inutilement grevante lorsqu'il n'y a pas d'ambiguïté comme ici.le 20/02/2017 à 20:06 -
picodevMembre émériteUtiliser assert pour vérifier une erreur runtime est une mauvaise pratique, elle est même fautive car si la macro NDEBUG est définie alors assert ne fait rien.
Une assertion ne doit servir que lors du développement pour s'assurer qu'on utilise une API correctement par exemple, jamais pour s'assurer une allocation de ressources.
J'imagine que l'objectif est aussi de ne pas donner de mauvaises habitudes.
Et du coup on passera en C99 quand la norme C2x sortira ?le 25/02/2017 à 16:49 -
picodevMembre émérite@sambia39: tout à fait. assert = à utiliser uniquement lors du développement pour traquer les erreurs d'utilisations de l'API par exemple, à ne jamais utiliser en version release pour traquer les erreurs runtime.
Un exemple plus correct remplacera l'assertion
Code : assert(f != NULL);
Code : 1
2
3
4if (f==NULL) { perror("fopen"); exit(EXIT_FAILURE); }
Comme on est en C11 on peut aussi utiliser les designated init :
au lieu de :
Code : t_capteur c = { 0, "", 0.0f };
Code : t_capteur c = { .id=0, .nom="", .valeur=0.0f };
le 20/02/2017 à 19:16 -
picodevMembre émériteOui c'est vrai ... un if else c'est mieux. L'important étant sans doute l'utilisation de perror.
Ça c'est plus une préférence personnelle mais je ne suis pas non plus d'avis d'user et abuser de cette syntaxe, certes souvent pratique mais inutilement grevante lorsqu'il n'y a pas d'ambiguïté comme ici.
C'est vrai que c'est verbeux pour un programme de 15 lignes, mais dès qu'on doit chercher loin pour avoir la définition c'est mieux.le 20/02/2017 à 20:22 -
sambia39Membre expérimentéDisant que le choix entre return et exit est plutôt d’ordre préférentiel, mais je l’admets tout de même qu’on l’utilise à tort. Personnellement, j’utilise la fonction exit uniquement dans le cas où j’ai une erreur irrécupérable qui s’est produite où quand un return de l’information de cette erreur excède plus de 3 niveaux de profondeur de fonction.
à bientôtle 20/02/2017 à 21:55 -
Bonjour,
Je partage l'avis de picodev sur l'utilisation d'assert.
Je constate en même temps un « s » en trop dans le format de fscanf :
Code : compte = fscanf(f, "%d-%[^:s]:%f\n", &(c.id), c.nom, &(c.valeur));
le 26/02/2017 à 7:58 -
BkteroModérateurJe crois que j'ai la flemme de développer une réponse quant a l'assertion et encore plus sur le C2x.
Effectivement pour le s, c'est une erreur !le 26/02/2017 à 11:36 -
picodevMembre émériteDans ce cas, autant faire comme en amour : vieux vaut ne rien faire que de ne le faire qu'à moitié.
Je propose simplement la suppression de l'assertion.le 26/02/2017 à 12:02