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 :

[Linux] chaînes de caractères [[un]signed] char


Sujet :

C

  1. #1
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut [Linux] chaînes de caractères [[un]signed] char
    Bonjour

    On me demande de toujours mettre signed ou unsigned devant chaque déclaration !
    Je souhaite bien sur compiler sans warning.

    Je dispose de deux versions de Mandriva Linux (2006 et cooker), sur cooker un unsigned char chn[40]; ou un signed char chn[40]; ne génèrent pas de warning alors que sous 2006, les deux génèrent des warning :
    Code gcc sous 2006 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ gcc foot-chaine.c
    foot-chaine.c: In function 'lecture':
    foot-chaine.c:511: warning: pointer targets in passing argument 1 of 'fgets' differ in signedness
    foot-chaine.c:525: warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness

    Peut-on m'indiquer la politique réelle vis à vis des chaînes de caractères !

    Merci

  2. #2
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Hello,

    Citation Envoyé par troumad
    Bonjour

    On me demande de toujours mettre signed ou unsigned devant chaque déclaration !
    Je souhaite bien sur compiler sans warning.

    Je dispose de deux versions de Mandriva Linux (2006 et cooker), sur cooker un unsigned char chn[40]; ou un signed char chn[40]; ne génèrent pas de warning alors que sous 2006, les deux génèrent des warning :
    Code gcc sous 2006 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ gcc foot-chaine.c
    foot-chaine.c: In function 'lecture':
    foot-chaine.c:511: warning: pointer targets in passing argument 1 of 'fgets' differ in signedness
    foot-chaine.c:525: warning: pointer targets in passing argument 1 of 'sscanf' differ in signedness

    Peut-on m'indiquer la politique réelle vis à vis des chaînes de caractères !

    Merci
    Tout à fait normal comme réaction de la part de gcc. En C, il y a en fait 3 types caractère :
    -> char
    -> unsigned char
    -> signed char

    Les fonctions fgets() et sscanf() attendent des arguments type char * et non des unsigned char * ou signed char *. C'est pourquoi gcc émet ces avertissements. Quand on spécifie l'option au niveau de son compilateur qui permet de traiter le type char comme étant 'signed char' ou 'unsigned char', c'est uniquement en terme de représentation (valeur) et non en terme de type. Voilà voilà.

    A+

  3. #3
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Merci
    Je transmets

  4. #4
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Une remarque sous Mandriva cooker, les warning disparaissent alors que sous Mandriva 2006, ils sont là !

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par troumad
    On me demande de toujours mettre signed ou unsigned devant chaque déclaration !
    Qui est ce 'on' ? Il se trompe...
    Peut-on m'indiquer la politique réelle vis à vis des chaînes de caractères !
    C'est char tout court. Point.

  6. #6
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Qui est ce 'on' ? Il se trompe...
    C'est un collègue qui dit que tous les compillos n'ont pas les mêmes normes, alors il faut faire ça pour être sûr du résultat. Il fait beaucoup de compilation sur microcontroleur.

    Citation Envoyé par Emmanuel Delahaye
    C'est char tout court. Point.
    J'aurais besoin d'un lien officiel !

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par troumad
    C'est un collègue qui dit que tous les compillos n'ont pas les mêmes normes, alors il faut faire ça pour être sûr du résultat. Il fait beaucoup de compilation sur microcontroleur.

    J'aurais besoin d'un lien officiel !
    http://www.open-std.org/JTC1/SC22/WG...docs/n1124.pdf

  8. #8
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    Merci

    Je fais suivre.

  9. #9
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 602
    Points : 7 837
    Points
    7 837
    Par défaut
    D'après ton document, tu as :
    An object declared as type char is large enough to store any member of the basic
    execution character set. If a member of the basic execution character set is stored in a
    char object, its value is guaranteed to be nonnegative. If any other character is stored in
    a char object, the resulting value is implementation-defined but shall be within the range
    of values that can be represented in that type.
    Le problème, c'est que ça ne marche pas avec les codes suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    void main (void)
    {
     char c='A';
        c = c+127;
     if (c> 127)
     {
      printf("char unsigned");
     }
     else
     {
      printf("char signed");
     }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    void main (void)
    {
     
     if ('à'>'A')
     {
      printf("char unsigned");
     }
     else
     {
      printf("char signed");
     }
    }

  10. #10
    Membre averti
    Avatar de Foobar1329
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Juin 2006
    Messages : 283
    Points : 387
    Points
    387
    Par défaut
    Citation Envoyé par troumad
    D'après ton document, tu as :
    Le problème, c'est que ça ne marche pas avec les codes suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #include <stdio.h>
    void main (void)
    {
     char c='A';
        c = c+127;
     if (c> 127)
     {
      printf("char unsigned");
     }
     else
     {
      printf("char signed");
     }
    }
    'A' est bien dans le jeu de caractères "C", que tu affectes à c. Ce dernier a une valeur (exple: 65 en base 10 en ASCII) comprise entre 0 et 255 ou -128 et 127 comme dit dans le document, et 'A' > 0 que char soit traité comme signed char ou comme unsigned char. Là où ça ne va pas, c'est que tu ne sais pas justement comment sera traité ton char, donc ajouter ici 127 à 'A' peut produire un comportement indéfini si char est traité comme un signed char (integer overflow). Dès que tu utilises un caractère autre qu'un de ceux spécifiés dans le jeu de caractères "C", c'est défini par ton implémentation, certains vont tenir dans un char (et pourront être négatifs tant qu'ils sont dans la plage de valeurs du type char), d'autres auront besoin d'un type de caractère étendu comme wchar_t, défini en C depuis C95 (C90 + des trucs).
    Là, dans ce cas, utiliser le type unsigned char explicitement aurait permis effectivement d'éviter l'UB (si ça dépasse UCHAR_MAX de N, ça repart à 0+N), mais le test qui s'ensuit n'est pas forcément bon.

    Citation Envoyé par troumad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <stdio.h>
    void main (void)
    {
     
     if ('à'>'A')
     {
      printf("char unsigned");
     }
     else
     {
      printf("char signed");
     }
    }
    Même topo, c'est défini par ton implémentation, avec le risque dde comportement indéfini en moins. Ce n'est pas portable.

    A+

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/08/2015, 12h23
  2. Réponses: 10
    Dernier message: 10/01/2014, 17h12
  3. ajouter [une chaîne de caractères ] tableau char
    Par silver4 dans le forum Débuter
    Réponses: 8
    Dernier message: 08/03/2013, 11h21
  4. char et chaîne de caractères : problème d'espaces
    Par recherche888 dans le forum MATLAB
    Réponses: 17
    Dernier message: 03/02/2012, 10h23
  5. [Lazarus] [Linux] Supprimer une chaîne de caractères connue
    Par winow dans le forum Lazarus
    Réponses: 11
    Dernier message: 15/02/2010, 12h06

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