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' from 'int' may alter its value, besoin d'explication.


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Boulanger
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Boulanger
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut char' from 'int' may alter its value, besoin d'explication.
    Bonjour,

    J' apprend le langage petit à petit et j'ai coder un répertoire en console, j ' aimerais en même temps vos avis :

    Mais il y a une fonction que je ne comprend, c'est la fonction dont le prototype est : int tolower( int c ).

    J'ai une fonction qui converti une chaine en minuscule:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    int verifier(char motLu[], char code)
    {
       const char motDe_Modif[5][10] = { {"nom"}, {"prenom"}, {"tel"} , {"civiliter"}, {"statut"} };
       const char civiliter[3][6]= { {"mr"}, {"mlle"}, {"mme"} };
       int i= 0;
       for( ; motLu[i] != '\0'; motLu[i]= tolower(motLu[i]), i++); // conversion du mot en minuscule
    ...
    .....
    }
    Mon compilateur m'indique un warning: conversion to 'char' from 'int' may alter its value.

    Traduction : convertir un char en un int peut changer sa valeur, je présume que la fonction utilise la formule suivante pour convertir la lettre: lettre + 'A' - 'a'. Dans l'hypothèse que tout le monde dispose de la même table ASCII et que la façon dont j'emploie cette fonction est correct, je ne comprends pas vraiment ce qu' il cloche.

    Je met un char dans la fonction alors qu'elle attend un int mais il me semble qu'il y a une conversion dans ce cas, puisque une lettre est un nombre.

    Merci d'avance !

    Cordialement,
    ZeroToto.

    Le man tolower() http://www.linux-kheops.com/doc/man/...tolower.3.html

  2. #2
    Membre confirmé

    Profil pro
    Inscrit en
    Août 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 178
    Points : 451
    Points
    451
    Par défaut
    Bonjour,

    Effectivement, une lettre (enfin un char) est un nombre et la conversion se fait automatiquement, ton compilateur t'averti lorsque tu passes d'un int à un char parce qu'un char est stocké sur un espace plus petit et donc que tu risques de perdre une partie des données

    http://c.developpez.com/faq/?page=types_general

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Bonjour,

    un int peut contenir un char, mais un char ne peut pas forcément contenir un int.
    Il s'agit juste d'un warning, que tu peux éliminer en forçant le cast de la valeur de retour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    motLu[i]= (char)tolower( motLu[i] ), i++ );
    ps: pour le code, il y a la balise CODE, la balise QUOTE c'est pour les citations.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Mai 2005
    Messages
    264
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 264
    Points : 725
    Points
    725
    Par défaut
    Citation Envoyé par ZeroToto Voir le message
    Je présume que la fonction utilise la formule suivante pour convertir la lettre: lettre + 'A' - 'a'. Dans l'hypothèse que tout le monde dispose de la même table ASCII et que la façon dont j'emploie cette fonction est correct, je ne comprends pas vraiment ce qu' il cloche.
    Bonjour,

    La formule que tu donnes n'est valable que pour le jeu de caractère ASCII. Dans l'hypothèse où le système cible utilise un jeu de caractères différent (EBCDIC, par exemple). Mieux vaut ne pas se poser ce genre de questions et laisser faire tolower() et toupper().

    Le warning que tu as est normal, il vient du fait que le type d'une constante caractère en C est int. Tu peux le vérifier avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sizeof('A') == sizeof(int)
    qui devrait être vrai si tu compiles avec un compilateur C conforme à la norme, et faux sinon (notamment si tu compiles avec un compilateur C++).

    Les fonctions de manipulation de caractères déclarées dans l'en-tête <ctype.h> prennent donc en paramètre des ints et renvoient des ints.

    Tu essaies de stocker un int dans un char, c'est normal que le compilateur te prévienne qu'il peut y avoir un problème si ton int est trop grand.
    "By and large I'm trying to minimize mentions of D in C++ contexts because it's as unfair as bringing a machine gun to a knife fight." - Andrei Alexandrescu

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Boulanger
    Inscrit en
    Avril 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Boulanger
    Secteur : Alimentation

    Informations forums :
    Inscription : Avril 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Je comprends mieux, je connaissait EBCDIC, je pensais que tout les ordinateurs avais comme base la table ASCCI.

    Pensez vous que ces fonctions sont optimisé pour tout les jeu de caractères ?

    Merci pour vos réponses !

    ZeroToto.

Discussions similaires

  1. Convertion char vers int
    Par barthelv dans le forum C
    Réponses: 8
    Dernier message: 08/10/2011, 21h45
  2. [Debutant] conversion de char en int
    Par Marc_3 dans le forum Langage
    Réponses: 9
    Dernier message: 31/08/2011, 12h02
  3. High-values/low-values, besoin d'explications
    Par lamorkytu dans le forum Cobol
    Réponses: 8
    Dernier message: 05/06/2009, 16h36
  4. [Conversion]Convertir un char[] en int
    Par ThanosT dans le forum Général Java
    Réponses: 10
    Dernier message: 11/11/2005, 12h23
  5. "Conversion" d'un char en int ou longueur
    Par Michaël dans le forum C
    Réponses: 6
    Dernier message: 15/08/2003, 11h40

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