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 :

"char" : nocifs ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fullben
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 58
    Par défaut "char" : nocifs ?
    pourquoi les "char" sont "néfastes" pour les débutants é le sont-ils vraiment ????????

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Le type "char" n'est absolument pas nocif pour un débutant...

    Ce qui est nocif, car sujet à de nombreux problèmes qui peuvent ete évités, c'est l'utilisation d'un tableau de char pour créer une chaine de caractères au lieu de la classe std::string...

    En effet, un tableau de caractères fournis une chaine "C style", qui est soumise à - entre autres - tous les problèmes rencontrés avec les tableaux:
    • comportement indéfinis en cas de mauvaise initialisation,
    • problèmes propres au dépassement de capacité (11 caractères dans un tableau prévu pour en contenir 10)
    • ...


    La classe std::string est suffisemment robuste pour permettre d'éviter risquer de se "tirer dans le pieds" et pour limiter ce genre de problème, tout en permettant, finalement, tout ce qui est possible avec les chaine "C style".

    En cela, les chaines de caractères C style sont "nocives" (disons plutot: moins bien adaptée, moins faciles à utiliser, plus source d'erreur) mais ce n'est nullement un point de vue à élargir au type char

    Le type char est à utiliser chaque fois que, réellement, tu veux travailler sur un caractère qui, d'une manière ou d'une autre, peut etre considéré comme étant pris séparément de l'ensemble des caractères composant une chaine (ou pour toute valeur ayant une fouchette comprise dans celle correspondant au type char)
    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

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Je seconde globalement les propos du phascolarctidé, et ajoute juste un autre risque, cette fois-ci lié aux chars eux même : Certains font des suppositions sur la façon dont certains caractères sont codés, et utilises ces suppositions peu fondées (même si ça a l'air de marcher avec le compilateur courant), pour par exemple dire que 'A' + 1 serait égal à 'B' ou que l'ordre des char est un ordre alphabétique, ou pour passer en majuscules à base de c - 'a' + 'A'. Ce genre de choses est d'autant plus gênant dans un contexte internationnal.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Par défaut
    Bonjour,
    Citation Envoyé par JolyLoic
    Je seconde globalement les propos du phascolarctidé, et ajoute juste un autre risque, cette fois-ci lié aux chars eux même : Certains font des suppositions sur la façon dont certains caractères sont codés, et utilises ces suppositions peu fondées (même si ça a l'air de marcher avec le compilateur courant), pour par exemple dire que 'A' + 1 serait égal à 'B' ou que l'ordre des char est un ordre alphabétique, ou pour passer en majuscules à base de c - 'a' + 'A'. Ce genre de choses est d'autant plus gênant dans un contexte internationnal.
    Je ne pense pas que les std::string donnent la solution à ce problème, ou alors un gros truc m'a échappé.

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    A mon tour.

    Le principal problème des char* et autres char[] pour un débutant, c'est que ces types l'éloignent de ce qui est vraiment important à son niveau => l'agorithmie.

    De plus, pour qu'il soit à même de produire un semblant de quelque chose, les cours reposant sur ces types primitifs prennent quantité de raccourcis qui introduisent des vulnérabilités, ou des limitations d'un autre âge. Un code correct étant souvent d'une compléxité à dégouter n'importe qui à ce niveau -- voire même après.
    Et donc pourquoi s'embéter vu qu'il y a un type chaîne qui s'avère très simple à utiliser correctement ?

    Ca, c'est pour les débutants.
    Concernant les gens expérimentés. Vu que l'on a autre chose à faire que de se prendre le choux à toujours refaire les mêmes TDs dans nos codes de production, on laisse tomber ces 2 types primitifs au profit de types encapsulant toute la partie pénible liée à la gestion des chaines de caractères.
    Au passage, ces types nous offrent une plus grande robustesse et une maintenabilité accrue.

    std::string est le type standard pour cela -- diverses bibliothèques graphiques se sentent obligées de définir leur propre type pour les chaînes de caractères.


    Après, il nous arrive ponctuellement de revenir à des char* pour des raisons d'optimisation quand on sait qu'il y a à y gagner dans des situations bien précises. Ou pour s'interfacer avec certaines API.


    NB: le moment venu, ce débutant enfin initié, et à vocation de devenir informaticien professionnel, devra faire ces TDs où l'on manipule des buffers de char à la main. Le temps de quelques TDs incontournables histoire de comprendre comment ça marche dedans.

    Lectures:
    -> FAQ, chapite sur les std::string
    -> un article de Bjarne Stroustrup au sujet qu'il faut apprendre le C++ comme un langage à part entière, et indépendant, sans s'encombrer de bagages et autres oeillières. (je résume à ma sauce). Le lien est dispo dans un des points de la FAQ qu'il maintient sur son site (google!)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Comprenons nous bien, en informatique, il n'y a rien de "nocif", rien d'obligatoire, et rien d'interdit...

    Par contre, il y a une optique qui est, toujours néfaste et nocive: c'est celle du "pourquoi faire simple quand on peut faire compliqué"...

    C'est pour cette simple et unique raison qu'on *conseille tres largement* aux débutants de se tourner vers les std::string plutot que vers les char[]... Et, chose bizare, c'est aussi la raison qui fait que les personnes mieux initiées continuent à utiliser les string plutot que des tableaux de caractères

    Bref, autant le dire, il n'est nullement question (du moins de mon point de vue) de "diaboliser" une pratique ou une autre...

    Il est plutot question d'utiliser LA technique qui, dans une situation donnée, me donnera le meilleur résultat dans un minimum de temps...

    Au fait, savais tu que la grosse majorité du retard intervient, non pas en période de codage, mais du fait du débuggage
    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

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Il est plutot question d'utiliser LA technique qui, dans une situation donnée, me donnera le meilleur résultat dans un minimum de temps...
    Il ne faut pas pour autant sacrifier flexibilité, généricité et maintenabilité.

Discussions similaires

  1. UPDATE en ajoutant un 0 sur un champ de type "char"
    Par doum2 dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/03/2006, 14h22

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