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

Ruby Discussion :

surcharge d'opérateurs du type "var[31:0]"


Sujet :

Ruby

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut surcharge d'opérateurs du type "var[31:0]"
    Bonsoir,

    Excusez moi si je reposte ce message, j'ai l'impression qu'il n'est pas passé car je ne le vois pas dans la liste.

    Je voudrais savoir comment surcharger les opérateurs pour pouvoir accéder à certains bits d'un entier.
    Par exemple :
    var[31:16] correspondrait au 16 bits de poids fort de mon entier var
    var[15:8] correspondrait au 2ème octet de mon entier var

    Merci

    Frédéric

  2. #2
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Il est possible de modifier l'opérateur existant pour la classe Fixnum, mais c'est plutôt casse-gueule. Il faut redéfinir l'opérateur existant qui permet de récupérer un bit pour prendre en compte la class Range (tu n'écriras pas X:Y mais X..Y).
    Je te déconseille fortement ce genre de manip à moins d'être vraiment sûr de ton coup:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    > 3[0]
     => 1
    >
    > class Fixnum
    >   def [] arg
    >      p "Oh!, j'ai cassé l'opérateur!"
    >   end
    > end
    >
    > 3[0]
    "Oh!, j'ai cassé l'opérateur!"
     => "Oh!, j'ai cassé l'opérateur!"
    Il vaut mieux utiliser un bon vieux masque/décalage pour récupérer la valeur que tu cherches. Pour les 16 bits de poids fort par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (x & 0xFFFF0000) >> 16
    Sinon tu peux jeter un oeil du côté de la gem bit-struct si tu veux jouer avec des bitfields.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci pour ta réponse.
    En fait je voudrais éviter à l'utilisateur d'avoir à calculer les masques et décalages, c'est pour ça que je pensais utiliser les [ ].

    La manip que tu as faite correspond exactement à ce que je cherche:-)
    Comment je peux récupérer les indices X et Y dans la fonction de surcharge ?


    Fred

  4. #4
    Membre habitué
    Inscrit en
    Décembre 2004
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 119
    Points : 156
    Points
    156
    Par défaut
    Comme je ne suis pas fan de changer l'opérateur [] car il faudrait maintenir le fonctionnement actuel en plus du nouveau en croisant les doigts pour ne rien casser, voilà une fonction à l'arrache.

    Elle doit faire ce que vous voulez, mais attention, sans aucun check des ranges de bits demandés et sans considérer les dérapages possibles liés au changement de type en cas d'âneries.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    class Fixnum
      def my_bitfield range
        raise ArgumentError unless Range == range.class
        mask = 2**(range.last+1) - 2**range.first
        (self & mask) >> range.first
      end
    end
     
    > 0x8000F134.my_bitfield 16..31
     => 32768

Discussions similaires

  1. Type de retour des surcharges d'opérateur
    Par syl1405 dans le forum C++
    Réponses: 8
    Dernier message: 16/06/2010, 17h22
  2. [Surcharge d'opérateurs] Type de retour
    Par Nanoc dans le forum C++
    Réponses: 10
    Dernier message: 28/11/2008, 18h48
  3. [C#] Tri d'objet et surcharge d'opérateur
    Par Royd938 dans le forum Windows Forms
    Réponses: 6
    Dernier message: 17/12/2007, 00h26
  4. Cumul de surcharges d'opérateurs
    Par Nats dans le forum C++
    Réponses: 2
    Dernier message: 11/10/2004, 13h37
  5. [VB .NET] Surcharge d'opérateur
    Par Franckintosh dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/09/2004, 19h05

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