IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Mise à jour de la FAQ C


Sujet :

C

  1. #1
    Community Manager

    Avatar de Malick
    Homme Profil pro
    Community Manager
    Inscrit en
    Juillet 2012
    Messages
    9 133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Sénégal

    Informations professionnelles :
    Activité : Community Manager
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2012
    Messages : 9 133
    Points : 83 972
    Points
    83 972
    Billets dans le blog
    15
    Par défaut Mise à jour de la FAQ C
    Mise à jour de la FAQ C
    Avec désormais une sélection des cent quatre-vingt-une (181) meilleures réponses à vos questions

    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.

    Vous pouvez aussi contacter l'équipe de rédaction
    .
    Vous avez envie de contribuer au sein du Club Developpez.com ? Contactez-nous maintenant !
    Vous êtes passionné, vous souhaitez partager vos connaissances en informatique, vous souhaitez faire partie de la rédaction.
    Il suffit de vous porter volontaire et de nous faire part de vos envies de contributions :
    Rédaction d'articles/cours/tutoriels, Traduction, Contribution dans la FAQ, Rédaction de news, interviews et témoignages, Organisation de défis, de débats et de sondages, Relecture technique, Modération, Correction orthographique, etc.
    Vous avez d'autres propositions de contributions à nous faire ? Vous souhaitez en savoir davantage ? N'hésitez pas à nous approcher.

  2. #2
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Bonjour,
    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écessaire

  3. #3
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    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ôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  4. #4
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    @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
    par un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (f==NULL) {
      perror("fopen");
      exit(EXIT_FAILURE);
    }

    Comme on est en C11 on peut aussi utiliser les designated init :

    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_capteur c = { 0, "", 0.0f };
    on pourra préférer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_capteur c = { .id=0, .nom="", .valeur=0.0f };
    Dans compte = fscanf(f, "%d-%[^:s]:%f\n", &(c.id), c.nom, &(c.valeur)); le parenthésage n'est pas nécessaire la priorité de l'opérateur . étant supérieure à celle de l'opérateur & unaire. Mais bon ce n'est qu'un détail.

  5. #5
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    @picodev: Proposition d'exemple plus correct est correcte
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  6. #6
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    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 :

    Citation Envoyé par picodev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (f==NULL) {
      perror("fopen");
      exit(EXIT_FAILURE);
    }
    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.


    Citation Envoyé par picodev Voir le message
    Comme on est en C11 on peut aussi utiliser les designated init :

    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_capteur c = { 0, "", 0.0f };
    on pourra préférer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t_capteur c = { .id=0, .nom="", .valeur=0.0f };
    Ç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.

  7. #7
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    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.
    ...
    Oui 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 effectivement surtout utile dans la phase de développement où la composition de structures peut être modifiée, cela permet entre autre d'avoir des warnings pour des structures non complètement initialisée, et d'être certain que «la bonne partie» sera initialisée. Cela permet d'augmenter la lisibilité aussi dans certains cas : un truc = {20,1000,0}; est moins clair qu'un truc = { .temperature=20, .pression=1000, .echantillon=0}; ; pas la peine de retourner voir la définition pour savoir quoi correspond à quoi.
    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.

  8. #8
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    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.
    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ôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    L'objectif de cette entrée n'est pas d'expliquer comment bien ouvrir un fichier mais de comment charger des données. Une assertion correspond bien à ce que ce bout de code : il doit s'assurer que le descripteur est valide. J'aurais pu mettre le reste du code d'un if(!NULL). Il n'y a pas de contexte au chargement des données, c'est vraiment un snippet à adapter, gestion d'erreur y compris.

    Il n'est pas précisé qu'on est en C11 dans cette entrée donc pas de designated initializers.

  10. #10
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par Bktero Voir le message
    L'objectif de cette entrée n'est pas d'expliquer comment bien ouvrir un fichier mais de comment charger des données. Une assertion correspond bien à ce que ce bout de code : il doit s'assurer que le descripteur est valide. J'aurais pu mettre le reste du code d'un if(!NULL). Il n'y a pas de contexte au chargement des données, c'est vraiment un snippet à adapter, gestion d'erreur y compris.
    Utiliser 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.
    Citation Envoyé par Bktero Voir le message
    Il n'est pas précisé qu'on est en C11 dans cette entrée donc pas de designated initializers.
    Et du coup on passera en C99 quand la norme C2x sortira ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    compte = fscanf(f, "%d-%[^:s]:%f\n", &(c.id), c.nom, &(c.valeur));
    qui n'a rien à voir avec le format de chaîne %s, mais qui comme les deux points, s'arrête au premier « s » rencontré. Et je rajouterais volontiers la taille afin de se protéger contre les éventuelles chaînes trop longues occasionnant des dépassements.

  12. #12
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Je 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 !

  13. #13
    Membre émérite
    Homme Profil pro
    sans emploi
    Inscrit en
    Janvier 2014
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : sans emploi
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2014
    Messages : 539
    Points : 2 601
    Points
    2 601
    Par défaut
    Citation Envoyé par Bktero Voir le message
    L'objectif de cette entrée n'est pas d'expliquer comment bien ouvrir un fichier mais de comment charger des données.
    Citation Envoyé par Bktero Voir le message
    Je 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 !
    Dans 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.

  14. #14
    Expert éminent Avatar de marsupial
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2014
    Messages
    1 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Mars 2014
    Messages : 1 760
    Points : 7 183
    Points
    7 183
    Par défaut
    Pour ma part je suis d'accord avec les 2 méthodes de codage. Assert est bourrin, le if est plus fin.

    Dans un datacenter, j'utiliserai assert pour la bonne et simple raison qu'il peut être compromis et on ne peut pas se permettre de faire dans la finesse dans ce cas là. Et j'irai même plus loin dans le traitement de l'erreur : j'en fais une remontée pour gérer rapido une coupure de la connexion avec le centre de données avant que tout le SI puisse être impacté. A l'ère du Cloud cela a une importance essentielle. Ensuite j'isole le(s) postes rencontrant le dysfonctionnement pour trouver l'origine de la panne.

    En local, le if est préférable. Mais je suivrai la même méthode de traitement en isolant le(s) poste(s).

    N'importe quel bug cache souvent une attaque. Désolé de raisonner ainsi mais j'y peux rien
    Repeat after me
    Le monsieur lutte pour la défense des libertés individuelles et collectives

    Repeat after me...

Discussions similaires

  1. Mise à jour de la FAQ
    Par vermine dans le forum ASP
    Réponses: 2
    Dernier message: 09/11/2006, 14h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo