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 :

Comparaison d'unsigned char tout le temps fausse


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Astrophysicien
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Astrophysicien

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Par défaut Comparaison d'unsigned char tout le temps fausse
    Bonjour,

    J'ai un soucis sur une comparaison entre deux unsigned char qui me donne des résultats inattendu.

    Pour commencer, voici le code fautif :
    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
    16
    17
    18
    bool RectangleMap::contain(const int x, const int y) const
    {
    	int pos = this->toFlattenIdx(x, y);
     
    	if( pos < 0 || pos >= this->length )
    		return false;
     
    	std::cout << pos << " -> " << this->map[pos] << " and we don't want " << static_cast<unsigned>(this->Blocked) << std::endl;
     
    	if( this->map[pos] == this->Blocked )
    	{
    		std::cout << "Good!" << std::endl;
    		return false;
    	}
    	std::cout << pos << " -> " << this->map[pos] << " Nieh!?!" << std::endl;
     
    	return true;
    }
    Ici, this->map est de type : unsigned char* tandis que this->Blocked est de type unsigned char et vaut 0. La variable map contient uniquement des 0 ou des 1.
    La fonction int toFlattenIdx(const int x, const int y) const prend deux coordonnées x et y et me renvoie l'indice correspondant dans le tableau aplati (map en l'occurence).
    Les cout sont là pour déboguer.

    Mon problème avec ce code, c'est que this->map[pos] == this->Blocked est tout le temps faux, même lorsque map[pos] vaut 0 (et est donc égale à Blocked).
    Je ne comprend pas pourquoi. Les deux variables sont du même type, donc il n'y a pas de cast implicite qui pourrais intervenir....

    Quelqu'un a t'il une idée ?

    PS : y a t'il moyen d'utiliser la balise de code en mode "inline" ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Salut

    Ligne 8, tu affiches this->map[pos] et static_cast<unsigned>(this->Blocked), avec map[pos] et Blocked tous deux de type unsigned char.
    Du coup, est-ce que tu n'aurais pas le caractère '0' dans map et non l'entier 0.
    En d'autres termes, que se passe-t-il si tu affiches plutôt static_cast<unsigned>(this->map[pos]) ?

    Et pour la balise, c'est "c" à la place de "CODE".

  3. #3
    Membre à l'essai
    Homme Profil pro
    Astrophysicien
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Astrophysicien

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Par défaut
    Citation Envoyé par nokomprendo Voir le message
    Salut

    Ligne 8, tu affiches this->map[pos] et static_cast<unsigned>(this->Blocked), avec map[pos] et Blocked tous deux de type unsigned char.
    Du coup, est-ce que tu n'aurais pas le caractère '0' dans map et non l'entier 0.
    En d'autres termes, que se passe-t-il si tu affiches plutôt static_cast<unsigned>(this->map[pos]) ?

    Et pour la balise, c'est "c" à la place de "CODE".
    J'ai effectivement oublié le cast pour l'affichage.
    Je n'avais pas pensé au caractère '0' ! Et c'était ça.... Merci. Je me suis fait prendre au piége sur la lecture de fichier. Le code 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
    15
    std::ifstream mapFile(argv[1], std::ios::in);
    if( !mapFile )
    {
    	std::cerr << "Cannot open file '" << argv[1] << "'" << std::endl;
    	return -1;
    }
     
    mapFile >> mapWidth >> mapHeight;
     
    map = new unsigned char[mapWidth * mapHeight];
     
    for(unsigned int i = 0; i < mapWidth * mapHeight; ++i)
    	mapFile >> map[i];
     
    mapFile.close();
    lit les 0 et 1 comme des caractères, pas comme des nombres. Reste à trouver comment les lui faire lire comme des nombres.

    Habitude du C, je ne suis pas encore rompu au subtilité liè à la surcharge de fonction/opérateur du C++.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par StarCluster Voir le message
    Reste à trouver comment les lui faire lire comme des nombres.
    Peut-être en remplaçant la ligne 13 par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    {
        int n;
        mapFile >> n;
        map[i] = static_cast<unsigned char>(n);
    }

  5. #5
    Membre à l'essai
    Homme Profil pro
    Astrophysicien
    Inscrit en
    Septembre 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Astrophysicien

    Informations forums :
    Inscription : Septembre 2012
    Messages : 5
    Par défaut
    C'est aussi la solution à laquelle je suis venu. J'aurais préféré évité de passer par une valeur intermédiaire (question de goût), mais sans passer par les fonctions du C, ça ne me semble pas possible.

    Merci pour l'aide !

  6. #6
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Si tu es sur de n'avoir que des chiffres, tu peux toujours tenter un - '0' pour chaque valeur mapFile >> map[i]; map[i] -= '0';
    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.

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

Discussions similaires

  1. Réponses: 31
    Dernier message: 07/12/2006, 11h46
  2. La POO tout le temps et partout, vraiment ?
    Par segushi dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 19/05/2005, 20h24
  3. Réponses: 19
    Dernier message: 28/04/2005, 15h36
  4. [TextField] taper des chiffres...tout le temps...
    Par Piolet dans le forum Composants
    Réponses: 5
    Dernier message: 12/04/2005, 10h12
  5. char et unsigned char
    Par jobherzt dans le forum C++
    Réponses: 8
    Dernier message: 11/02/2005, 00h24

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