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 :

Opérateurs de transtypage


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut Opérateurs de transtypage
    Bonjour,
    pour m'exercer j'essaie de créer une classe u64 (unsigned codés sur 64 bits), en surchargeant les opérations sur cette classe:

    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    struct u64
    {
         u32 faible;
         u32 fort;
     
         u64(u64 &right) {
              faible = right.faible;
              fort = right.fort;
         }
     
         // u32 -> u64
         u64(u32 right) {
              faible = right;
              fort = 0;
         }
     
         u64& operator=(const u64 &right) {
              faible = right.faible;
              fort = right.fort;
              return (*this);
         }
     
         inline static void multiplie(const u32 left, const u32 right, u64 &result) {
              u32 a,b,c,d,i,j,k,l;
              a = left & 0xffff;
              b = ((u32)left) >> 16;
              c = right & 0xffff;
              d = ((u32)right) >> 16;
     
              i = a * c;
              j = a * d;
              k = b * c;
              l = b * d;
              j += k;
              if(j < k)
                   l++;
     
              result.faible = i + (j << 16);	// pas d'overFlow possible
              result.fort = l + (((u32)j) >> 16);	// idem
         }
     
         // u64 -> u32
         operator unsigned int const (void) {
              return faible;
         }
     
    };
     
    u64 operator*(const u64 &left, const u64 &right) {
         u64 result;
         u64 i,j,k;
     
         u64::multiplie(left.faible,right.faible,result);
         if((left.fort) || (right.faible)) {
              u64::multiplie(left.fort,right.faible,j);
              u64::multiplie(left.faible,right.fort,k);
              result.fort += j.faible + k.faible;
         }
     
         return result;
    }
    mais si j'execute le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    u64 a = 1 << 31;
    u64 b = 1 << 31;
    u64 c = a * b;
    c vaut 0 !

    alors que ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    u64 a = 1 << 31;
    u64 b = 1 << 31;
    u64 c;
    c = a * b;
    me renvoie bien le bon résultat 1 << 62.

    en step-by-step, on voit que dans le premier cas c'est l'opérateur de copie qui est utilisé, et pour une raison qui m'échappe, dans le second cas le compilo préfère caster le résultat de a * b en u32 puis lui appliquer le constructeur 32 bits u64(u32 right) plutôt que d'utiliser directement l'opérateur de copie 64 bits u64(u64 &right).
    A noter que si j'enlève le code permettant le cast de u64 à u32, ou le constructeur 32 bits u64(u32 right), alors il utilise bien l'opérateur de copie 64 bits u64(u64 &right) et la valeur de c devient juste dans les 2 morceaux de codes ci-dessus.

    D'où ma question: 1) commet expliquer au compilo que c'est bien l'opérateur de copie 64 bit qu'il doit utiliser dans ce cas, et pas le constructeur 32 bits ?

    et 2) (question subsidiaire): est-ce que c'est possible de désactiver le cast implicite dans le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    operator unsigned int const (void) {
         return faible;
    }
    un peu dans le genre du mot clé explicit qu'on peut ajouter devant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    explicit u64(u32 right) {
         faible = right;
         fort = 0;
    }
    puisque en principe on voudrait plutôt que l'utilisateur puisse faire librement des:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    u64 a;
    u32 b = 10;
    a = b;
    plutôt que des:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    u64 a = 1 << 50;
    u32 b;
    b = a;
    (qui eux devraient générer une erreur sauf si on cast b = (u32)a; )

    merci d'avance !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il n'est pas certain que ce soit la source de l'erreur, mais le paramètre du constructeur de copie est censé être const.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Il n'est pas certain que ce soit la source de l'erreur, mais le paramètre du constructeur de copie est censé être const.
    ha oui exacte, ça marche avec const.

    merci beaucoup !

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

Discussions similaires

  1. surcharge d'opérateur de transtypage
    Par Sylvain Rousseau dans le forum Langage
    Réponses: 6
    Dernier message: 24/10/2009, 12h33
  2. opérateur non applicable à ce type d'opérande
    Par Amon dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2003, 18h07
  3. [imprecis]Réaliser a^n avec seulement l'opérateur d'addition
    Par Amon dans le forum Algorithmes et structures de données
    Réponses: 18
    Dernier message: 08/11/2002, 22h22
  4. [transtypage]PChar et WideString
    Par rbag dans le forum Bases de données
    Réponses: 2
    Dernier message: 05/09/2002, 20h12

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