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 :

HashCode avec lettres accentuées...


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut HashCode avec lettres accentuées...
    Bonjour,
    j'ai la fonction suivante qui me permet de calculer un code en fonction d'une chaîne de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        * int HashCode(string chaine)
        * {
        *     int ret=0;        // valeur retournée
        *     int p=0;        // parcours de la chaine en entree
        *     cout << chaine << " : " << (unsigned int)chaine[p] << endl; //////////////
        *     while(chaine[p] != '\0')
        *     {
        *         ret = ret*256 + (unsigned int) chaine[p];
        *         if (ret >= TAILLE_MAX_TAB)  
        *             ret = ret%TAILLE_MAX_TAB;
        *         p++;
        *     }
        *     cout << ret << endl; ///////////
        *     return ret;
        * }
    Il y a un problème lorsque la chaine passée en paramètre commence par une lettre accentuée (ret prend alors comme valeur -xxxxxxxxx) et j'aimerais résoudre ce problème sans bidouillage (si je met une condition sur les caractères à lire ca fonctionne mais ca rend la fonction de hashcode moins performante!)
    Quelqu'un a une idée ?

  2. #2
    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
    Je ne suis pas sûr que mettre un caractère accentué dans un string soit une bonne idée, il est normal que tu obtiennes des nombres négatifs.

    Ensuite ta fonction est incorrecte, un string n'est pas nécessairement terminé par un \0

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int HashCode(const string& chaine) // <-- référence constante !
    {
        for (string::const_iterator it = chaine.begin(); it != chaine.end(); ++it)
        {
            ret = ret * 256 + *it;
            ...
        }
     
        return ret;
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2005
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Ok merci loulou24 pour la correction de la boucle.
    Par contre pour les caractères accentués je n'ai pas vraiment le choix ! En fait c'est un logiciel qui est en rapport avec les mots de la langue francaise et si je n'ai pas les accents ca ne peut pas fonctionner!
    Bon ben me reste plus que la solution de ne pas prendre en compte dans ma fonction de hash toutes les lettre accentuées !

  4. #4
    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
    J'imagine qu'il y a des moyens propres de gérer les caractères accentués. Je n'ai encore jamais cherché à le faire, mais je suis sûr que quelqu'un d'autre te donnera une bonne solution

  5. #5
    Membre habitué Avatar de ken_le_videur
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    129
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 129
    Points : 145
    Points
    145
    Par défaut
    C'est normal, les caractères accentués sont en ASCII >127 donc ça nous fait un char < 0 et je ne pense pas que ton cast en unsigned int y change grand chose

Discussions similaires

  1. REGEX - Repérer des mots avec des lettres accentuées
    Par rambc dans le forum Général Python
    Réponses: 2
    Dernier message: 16/07/2011, 15h33
  2. Réponses: 6
    Dernier message: 12/12/2006, 11h27
  3. Récupération des lettres accentuées
    Par troumad dans le forum Installation
    Réponses: 5
    Dernier message: 15/11/2005, 21h28
  4. [JEditorPane] Problème avec caractère accentué
    Par scifire dans le forum Composants
    Réponses: 6
    Dernier message: 14/09/2005, 14h58
  5. Comment entrer des lettres accentuées sous postgresql ?
    Par Chihuahua dans le forum Requêtes
    Réponses: 11
    Dernier message: 28/08/2003, 08h04

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