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 :

Masque avec la valeur 1000


Sujet :

C++

  1. #1
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut Masque avec la valeur 1000
    Bonjour,

    Voici le bout de code qui me pose pb :

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
    // meme pb avec un long, unsigned int, unsigned long
    int transfert = 0;
     
    while (transfert < 11111)
    {
       ifstream etat1("c:\\user\\svelt\\titres.txt", ios::nocreate | ios::binary);
       if(etat1)
       {
           IlvPrint("Transfert av = %d", transfert);
           transfert |= 10000;
           IlvPrint("Transfert ap = %d", transfert);
       }
       etat1.close();
     
       ifstream etat2("c:\\user\\svelt\\gammes.txt", ios::nocreate | ios::binary);
       if(etat2)
       {
          IlvPrint("Transfert av = %d", transfert);
          transfert |= (long)1000;
          IlvPrint("Transfert ap = %d", transfert);
       }
       etat2.close();
     
       ifstream etat3("c:\\user\\svelt\\postes.txt", ios::nocreate | ios::binary);
       if(etat3)
       {
          IlvPrint("Transfert av = %d", transfert);
          transfert |= (long)100;
          IlvPrint("Transfert ap = %d", transfert);
       }
       etat3.close();
     
       ifstream etat4("c:\\user\\svelt\\relatgt.txt", ios::nocreate | ios::binary);
       if(etat4)
       {
          IlvPrint("Transfert av = %d", transfert);
          transfert |= (long)10;
          IlvPrint("Transfert ap = %d", transfert);
       }				
       etat4.close();
     
       ifstream etat5("c:\\user\\svelt\\relatgf.txt", ios::nocreate | ios::binary);
       if(etat5)
       {
          IlvPrint("Transfert av = %d", transfert);
          transfert |= (long)1;
          IlvPrint("Transfert ap = %d", transfert);
       }				
       etat5.close();
    }
    Le probleme est le suivant : tous les masques sont appliques comme il faut sauf pour la valeur 1000 (2eme test).
    A l'affichage, au lieu de rajouter 1000 a transfert, c'est 128 qui est rajoute, quelque soit la valeur precedente de transfert.
    Je ne m'explique vraiment pas ce comportement. Meme en castant les valeurs des masques, j'obtiens le meme resultat...
    Soit je ne suis pas reveille ce matin, soit je vais devoir appele Mulder et Scully
    Quelqu'un a une idee ?
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  2. #2
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Une petite correction, si le 2eme test est vrai des le premier essai, la valeur de transfert est passe a 10232, le 3eme fait passe la valeur a 10236, le 4eme a 10238 et le dernier a 10239. Les valeurs doivent etre interprete de maniere binaire d'une certaine maniere mais pourquoi et comment...aucune idee ! Quelqu'un voit le probleme ?
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  3. #3
    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
    Tu mélanges binaire et décimal. Si tu travailles avec des masques décimaux (ajout d'un multiple de 10 par état) alors utilise l'addition et non le OU binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const int mask0 = 1;
    const int mask1 = 10;
    const int mask2 = 100;
    const int mask3 = 1000;
     
    ...
     
    transfert += maskx;
    Si tu veux utiliser au contraire les masques binaires (ce qui est le plus communément fait car tu utilises un bit par état) alors il faut utiliser des masques binaires et non des multiples de 10

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    const int bit0 = 1 << 0; // 0001
    const int bit1 = 1 << 1; // 0010
    const int bit2 = 1 << 2; // 0100
    const int bit3 = 1 << 3; // 1000
     
    ...
     
    transfert |= bitx;

  4. #4
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Merci, j'ai compris ce que je faisais comme boulette.
    Mais as-tu une idee de pourquoi ce que je faisais fonctionnais jusqu'a ce que j'arrive a ce |= 1000 ?
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  5. #5
    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
    Ca dépend des représentations binaires de tes multiples de 10. Par le plus grand des hasards certains n'avaient aucun bit commun, ce qui fait que le OU binaire était alors équivalent à une addition.

  6. #6
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Ok merci puor tes reponses !
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

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

Discussions similaires

  1. [XL-2003] Graphique avec des valeurs masquées
    Par Sibuxian dans le forum Excel
    Réponses: 2
    Dernier message: 23/08/2010, 12h56
  2. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  3. Pb UPDATE champ nullable avec la valeur Null
    Par zev dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 01/02/2005, 14h04
  4. champ avec une valeur?
    Par sonialem2000 dans le forum Bases de données
    Réponses: 2
    Dernier message: 22/06/2004, 08h23
  5. Réponses: 6
    Dernier message: 04/04/2003, 15h28

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