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 :

warning incompris lors du remplissage d'un tableau de char avec des hexa


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut warning incompris lors du remplissage d'un tableau de char avec des hexa
    Bonjour à tous

    Je voudrais savoir ce que veux dire ce warning et comment m'en débarrasser :
    warning C4305: '=' : truncation from 'const int' to 'char'
    warning C4309: '=' : truncation of constant value

    sachant qu'il pointe vers la ligne suivante de mon progaramme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char ppp [256];
    ppp[0]= 0xff;
    est ce que c'est dû au fait que j'essaie de remplie le tableau de char avec des hexa????

    Merci bp pour votre aide et très bonne journée

  2. #2
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Le compilateur interprète 0xFF comme une constante entière, donc stockée sur 4 octets, alors que ton tableau contient des char stockés sur 1 octet. Il te prévient donc que si ta valeur dépasse 1 octet (> 0xFF) elle sera tronquée.

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    Merci pour ta réponse...
    Mais qu'est ce que ça veut dire 'tronquée' e est ce que cela aura une incidence sur mon programme même si mnt j'arrive à compiler et à exécuter sans problèmes????

    Merci bp

  4. #4
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Ca veut dire que si ta valeur entière que tu met dans ton char dépasse 1 octet tu perdras des informations. Par exemple si tu fait ppp[0] = 300, la valeur sera tronquée et ton ppp[0] ne contiendra en fait que 255. Pour ton prog si tu teste bien que toutes les valeurs que tu met dans ton tableau de char sont bien < à 255 tu ne devrais pas avoir de problèmes. Par contre si tu a des valeurs supérieures tu devras utilisé plutôt un tableau d'int pour éviter d'avoir de gros plantages inexpliqués.

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    Merciiiiiii

    Très bonne journée à toi!!!

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Pour stocker 255, j'aurais plutôt utilisé un unsigned char.

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Oui c'est vrai. (Mais je crois que les char sont en non signés par défaut sur la plupart des compilateurs)

  8. #8
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par sanatou
    Bonjour à tous

    Je voudrais savoir ce que veux dire ce warning et comment m'en débarrasser :
    warning C4305: '=' : truncation from 'const int' to 'char'
    warning C4309: '=' : truncation of constant value

    sachant qu'il pointe vers la ligne suivante de mon progaramme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char ppp [256];
    ppp[0]= 0xff;
    est ce que c'est dû au fait que j'essaie de remplie le tableau de char avec des hexa????

    Merci bp pour votre aide et très bonne journée
    Le probleme est que tu utilises vraissemblablement un systeme ou char signe. 0xFF est une constante entiere dont la valeur (255) est hors de ce qui est representable par le char de ton systeme, et le compilateur t'averti de ce fait.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  9. #9
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Genjin
    Le compilateur interprète 0xFF comme une constante entière, donc stockée sur 4 octets, alors que ton tableau contient des char stockés sur 1 octet. Il te prévient donc que si ta valeur dépasse 1 octet (> 0xFF) elle sera tronquée.
    Le compilateur sait tres bien que 0xFF est representable sur un octet. Le probleme est vraissemblablement que les char sont signes.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  10. #10
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Genjin
    Par exemple si tu fait ppp[0] = 300, la valeur sera tronquée et ton ppp[0] ne contiendra en fait que 255.
    N'importe quoi. La conversion d'une valeur non signee en une valeur signee quand le type n'est pas capable de representer la valeur non signee n'est pas definie. Le resultat est generalement que le motif des bits est conserve, donc la valeur sera vraissemblablement 44.

    Et avec ppp[0] = 255, le resultat est que ppp[0] contient -1.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  11. #11
    Membre à l'essai
    Inscrit en
    Décembre 2006
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 12
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet
    N'importe quoi. La conversion d'une valeur non signee en une valeur signee quand le type n'est pas capable de representer la valeur non signee n'est pas definie. Le resultat est generalement que le motif des bits est conserve, donc la valeur sera vraissemblablement 44.
    Oui mais j'étais parti sur le fait que les char sont non signés normalement.

    Citation Envoyé par Jean-Marc.Bourguet
    Le compilateur sait tres bien que 0xFF est representable sur un octet.
    Ca j'avoue que je n'en sait rien. Ca doit aussi dépendre des compilateurs.

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2006
    Messages
    117
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 117
    Points : 46
    Points
    46
    Par défaut
    Merci bp pour toutes vos réponses, il a suffit de déclarer le tableau de char de la façon suivante pour le problème soit résolu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    unsigned char ppp[256];
    Merci à tous encore une fois pour toutes ces explication et très bonne journée!!!

  13. #13
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Genjin
    Oui mais j'étais parti sur le fait que les char sont non signés normalement.
    J'aimerais bien savoir sur quoi tu te bases pour dire que les char sont "normalement" non signes. Ca dépend de l'architecture et j'ai l'impression que les chars signes sont plus communs (avec ce que j'ai sous la main Solaris sur Sparc, Linux sur x86 sont signes, AIX sur Power est non signe).

    Et si les chars sont non signes et sur 8 bits, mettre 300 dans un donne obligatoirement 44: le comportement modulo est impose.

    Ca j'avoue que je n'en sait rien. Ca doit aussi dépendre des compilateurs.
    Un compilateur qui donnerait ce warning pour des constantes sans s'assurer d'abord que la valeur n'est pas representable aurait tellement de faux positifs que le warning ne servirait a rien.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Genjin
    Ca veut dire que si ta valeur entière que tu met dans ton char dépasse 1 octet tu perdras des informations. Par exemple si tu fait ppp[0] = 300, la valeur sera tronquée et ton ppp[0] ne contiendra en fait que 255. Pour ton prog si tu teste bien que toutes les valeurs que tu met dans ton tableau de char sont bien < à 255 tu ne devrais pas avoir de problèmes. Par contre si tu a des valeurs supérieures tu devras utilisé plutôt un tableau d'int pour éviter d'avoir de gros plantages inexpliqués.
    Et encore, comme 300, en binaire utilise neuf bits significatifs (300=100101100 en binaire), la troncature fait juste "oublier" les bits de poids le plus fort qui n'entrent pas dans les 8 bits d'un char...

    Tu obtiendra donc 00101100 (44) et non 255
    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

  15. #15
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Points : 161
    Points
    161
    Par défaut
    Ca mériterait vérification, mais il me semble que les trois types "char", "unsigned char" et "signed char" sont différents. Il serait donc inapproprié de parler de signé ou non signé pour le type char ?

    D'ailleurs j'aurais tendance à les assigner ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    unsigned char uc = 0xFFu;
    signed char sc = +0x7F;
    char c = '\xFF';

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par Volune
    Ca mériterait vérification, mais il me semble que les trois types "char", "unsigned char" et "signed char" sont différents.
    Ce sont des types differents (ce qui joue pour la surcharge, les templates, ...) mais char doit etre equivalent a un des deux autres.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème lors du remplissage d'un tableau
    Par KevDrn dans le forum Excel
    Réponses: 1
    Dernier message: 10/07/2013, 12h05
  2. NullPointerException lors du remplissage d'un tableau
    Par VB 2008 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 10/06/2013, 14h00
  3. [XL-2010] Problème lors de la création de tableau croisé dynamique avec vba
    Par juju05 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/07/2012, 17h10
  4. Réponses: 4
    Dernier message: 11/06/2012, 16h11
  5. Réponses: 16
    Dernier message: 01/06/2008, 20h01

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