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 :

Le C++ expressif n° 3 : pourquoi les erreurs des templates posent des problèmes [Tutoriel]


Sujet :

C++

  1. #1
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut Le C++ expressif n° 3 : pourquoi les erreurs des templates posent des problèmes
    Bienvenue dans le troisième article de la série « le C++ expressif », une série d'articles consacrés aux Domain-Specific Embedded Language (DSEL) et à Boost.Proto, une bibliothèque pour les implémenter en C++.
    Dans cet article, Eric Niebler aborde le problème délicat des messages d'erreurs générés par les templates et surtout le fait que ce n'est pas une fatalité. Il insiste en particulier sur le fait qu'il est de la responsabilités des concepteurs de bibliothèques de faire en sorte que les messages d'erreurs soient compréhensibles par les utilisateurs.

    Le C++ expressif n° 3 : pourquoi les erreurs des templates posent des problèmes et qu'est-ce que vous pouvez faire pour ça ?

    Pensez-vous que la compléxité de message d'erreurs générés par les templates sont un frein à leurs utilisation ?
    Quelles techniques utilisez-vous pour générer des messages d'erreurs compréhensibles ?


    Retrouvez l'ensemble des articles de la série « Le C++ expressif » sur la page d'index.

  2. #2
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2008
    Messages
    832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2008
    Messages : 832
    Points : 2 625
    Points
    2 625
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    Bienvenue dans le troisième article de la série « le C++ expressif », une série d'articles consacrés aux Domain-Specific Embedded Language (DSEL) et à Boost.Proto, une bibliothèque pour les implémenter en C++.
    Dans cet article, Eric Niebler aborde le problème délicat des messages d'erreurs générés par les templates et surtout le fait que ce n'est pas une fatalité. Il insiste en particulier sur le fait qu'il est de la responsabilités des concepteurs de bibliothèques de faire en sorte que les messages d'erreurs soient compréhensibles par les utilisateurs.

    Le C++ expressif n° 3 : pourquoi les erreurs des templates posent des problèmes et qu'est-ce que vous pouvez faire pour ça ?

    Pensez-vous que la compléxité de message d'erreurs générés par les templates sont un frein à leurs utilisation ?
    Quelles techniques utilisez-vous pour générer des messages d'erreurs compréhensibles ?


    Retrouvez l'ensemble des articles de la série « Le C++ expressif » sur la page d'index.
    Pensez-vous que la compléxité de message d'erreurs générés par les templates sont un frein à leurs utilisation ?
    100 fois OUI.
    Une erreur dans l'usage d'un template avec G++ va générer des dizaines de lignes d'erreurs, qui dépassent largement les 80 caractères. Comprendre: il faut scroller, et pas qu'un peu.
    Sachant que la plus grosse partie de ces fameuses erreurs résulte dans le fait d'afficher les paramètres de chaque template. Y compris ceux par défaut (qu'on à donc pas changé et donc dont on se cogne).
    Exemple concret:
    std::unique_ptr prends 2 paramètres: le type, et la fonction de nettoyage. La fonction de nettoyage par défaut utilisant elle-même un type template utilisant le 1er template, on se retrouve vite avec un truc immonde et illisible.
    Idem pour les implémentations, elles sont généralement proprement imbuvables, même si à force je commence à comprendre vaguement comment ça marche.
    Bon, c'est sûr, une fois que c'est compilé, ça marche bien...

    Quelles techniques utilisez-vous pour générer des messages d'erreurs compréhensibles ?
    A la main malheureusement: je copie le message d'erreur et je vire tous les paramètres auxquels je n'ai pas touchés dans le code. Ca divise la taille du message par 3 minimum et c'est directement plus lisible.
    Mais je vais lire cet article et voir si le résultat est bon. Si c'est le cas, je me ferais un plaisir d'oublier ma vieille "méthode"...


    [edit]

    C'est le petit tiret [...]
    ça s'appelle une tilde.

    Suggestions:

    Remplacer les occurrences de C++0x par C++11 même si vu que c'est une traduction d'un article pré-C++11, il est logique de conserver C++0x.

    Le lien vers "l'article précédent" renvoie à la description de l'article. Boucle infinie neuronale? Bon, certes, cette description contiens un lien vers une sorte de sommaire, mais bon, tant qu'a faire, autant faire un vrai lien, ou ne pas mettre de lien à ce moment la.

  3. #3
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    Attention, le propos n'est pas trouver une méthode pour comprendre un message d'erreur abscons, mais de modifier les messages d'erreurs générés.

    Un exemple, pour être plus clair (provenant de Boost.Concept)

    Si on prend un tableau de complexe et que l'on essaie de le trier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<std::complex<float> > v;
    std::stable_sort(v.begin(), v.end());
    On va avoir le message d'erreur suivant dans gcc :
    /usr/include/c++/4.1.2/bits/stl_algo.h: In function ‘void std::
    __insertion_sort(_RandomAccessIterator, _RandomAccessIterator) [with
    _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::complex<float
    >*, std::vector<std::complex<float>, std::allocator<std::complex<
    float> > > >]’:
    /usr/include/c++/4.1.2/bits/stl_algo.h:3066: instantiated from ‘void
    std::__inplace_stable_sort(_RandomAccessIterator,
    _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::
    __normal_iterator<std::complex<float>*, std::vector<std::complex<
    float>, std::allocator<std::complex<float> > > >]’
    /usr/include/c++/4.1.2/bits/stl_algo.h:3776: instantiated from ‘void
    std::stable_sort(_RandomAccessIterator, _RandomAccessIterator) [with
    _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::complex<float
    >*, std::vector<std::complex<float>, std::allocator<std::complex<
    float> > > >]’
    bad_error_eg.cpp:8: instantiated from here
    /usr/include/c++/4.1.2/bits/stl_algo.h:2277: error: no match for
    ‘operator<’ in ‘__val < __first. __gnu_cxx::__normal_iterator<
    _Iterator, _Container>::operator* [with _Iterator = std::complex<float
    >*, _Container = std::vector<std::complex<float>, std::allocator<
    std::complex<float> > >]()’
    Ce qui n'aide pas.

    Alors qu'il suffit d'ajouter un assert adéquate pour générer un message compréhensible. Par exemple (pas sur du tout de mon code...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static_assert(Less<T>, "T must be Less comparable");
    Et il serait ainsi possible de tester les différentes conditions d'utilisation de stable_sort pour générer des messages d'erreurs compréhensibles.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,
    Citation Envoyé par gbdivers Voir le message
    Bienvenue dans le troisième article de la série « le C++ expressif », une série d'articles consacrés aux Domain-Specific Embedded Language (DSEL) et à Boost.Proto, une bibliothèque pour les implémenter en C++.
    Dans cet article, Eric Niebler aborde le problème délicat des messages d'erreurs générés par les templates et surtout le fait que ce n'est pas une fatalité. Il insiste en particulier sur le fait qu'il est de la responsabilités des concepteurs de bibliothèques de faire en sorte que les messages d'erreurs soient compréhensibles par les utilisateurs.

    Le C++ expressif n° 3 : pourquoi les erreurs des templates posent des problèmes et qu'est-ce que vous pouvez faire pour ça ?
    Un grand merci pour cette traduction qui m'a ouvert les yeux sur un océan de possibilités
    Pensez-vous que la compléxité de message d'erreurs générés par les templates sont un frein à leurs utilisation ?
    C'est une véritable horreur, même si, à la longue, on finit par arriver à les décrypter, cela nécessite le plus souvent un copier coller dans un éditeur de texte "correct" et une bonne mise en forme.

    Si les implémenteurs de la STL pouvaient s'organiser pour les rendre moins complexes, j'en serais ravi
    Quelles techniques utilisez-vous pour générer des messages d'erreurs compréhensibles ?
    Dans un projet preso qui est clairement orienté C++11, j'use et j'abuse de static_assert, et ca devient un véritable plaisir.

    Dans des projets plus anciens, je fais "avec", en fonction de ce que le projet permet
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 186
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 186
    Points : 17 126
    Points
    17 126
    Par défaut
    J'avais un script pour reformater ces messages d'erreurs, que je pipais aux compilations. Sauf que je l'ai perdu
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/06/2015, 15h14
  2. Réponses: 6
    Dernier message: 14/08/2014, 12h10
  3. Réponses: 125
    Dernier message: 23/06/2011, 17h46
  4. Réponses: 0
    Dernier message: 09/05/2011, 19h18
  5. Réponses: 3
    Dernier message: 02/10/2006, 22h13

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