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

Delphi .NET Discussion :

Champ de bits en delphi


Sujet :

Delphi .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut Champ de bits en delphi
    Bonjour je dois porter un bout de code C++ en delphi, il contient entre autre un champ de bits:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private:
        bool _agcb:1;
        bool _alb:1;
        unsigned int _gap:30;
    ce sont les champs d'une classe.

    J'ai consulté le tuto concernant les énumérations (qui traite aussi un peu des bit fields ici : http://laurent-dardenne.developpez.c...numbuilder/#L5, cependant, l'exemple étant court, je n'ai pas bien saisi la démarche. Quelle approche dois-je adopter pour réussir à mimer au mieux le comportement de mon code C++ ?

    Cordialement,

  2. #2
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 858
    Points : 11 299
    Points
    11 299
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private
        _agcb: LongBool = True; // je crois que 1=True ?
        _alb: LongBool = True;
        _gap: Cardinal = 30;
    mais je ne crois pas qu'on puisse initialiser les champs, seulement les propriétés, => à faire au Create
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  3. #3
    Membre chevronné

    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    1 519
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 519
    Points : 2 153
    Points
    2 153
    Billets dans le blog
    1
    Par défaut
    Bonjour.

    Effectivement l'initialisation de champ n'est pas permise au niveau de la partie interface (à l'exception des constantes et des variables globales) il faut redéfinir le constructeur de la classe pour faire ça.
    La FAQ - les Tutoriels - Le guide du développeur Delphi devant un problème

    Pas de sollicitations techniques par MP -

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par tourlourou Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private
        _agcb: LongBool = True; // je crois que 1=True ?
        _alb: LongBool = True;
        _gap: Cardinal = 30;
    mais je ne crois pas qu'on puisse initialiser les champs, seulement les propriétés, => à faire au Create
    j'aurais fait ceci

    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
     
    type
      TMonObjet = class
      private
        FFlags : Cardinal;
        function Get_agcb: Boolean;
        procedure Set_agcb(Value: Boolean);
        ...
        property _agcb : Boolean read Get_agcb write Set_agcb;
        property _alb: Boolean read Get_alb write Set_alb;
        property _gap : Cardinal read Get_gap write Set_gap;
      end;
     
    function TMonObjet.Get_agcb: Boolean;
    begin
      Result := (FFlags and 1) > 0;
    end;
     
    procedure Set_agcb(Value: Boolean);
    begin
      if Value  then 
       FFlags :=  FFlags or 1
      else
       FFlags := FFlags and (not 1);
    end;
    je vous laisse imaginer les autres fonctions

    PS: le ":1" indique le nombre de bits, pas une valeur par défaut
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 457
    Points : 24 870
    Points
    24 870
    Par défaut
    voir le sujet Encore un problème de traduction C++ delphi

    Par Enumération ça donnerait, pour un Delphi Win32, en mémoire, cela donnerait la même chose, ... pour .NET, je ne peux pas me prononcer ...


    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
    type
      TMesFlags = (_agcb, _alb);
      TMesFlagsSet = set of TMesFlags;
     
      TMesFlagRec = record
        case Boolean of
          True: 
            (
              Flags: TMesFlagsSet;
            );
           False:
             (
               Spare: Cardinal;  
             );
      end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private:
       Flags: TMesFlagRec;

    Citation Envoyé par Paul TOTH Voir le message
    je vous laisse imaginer les autres fonctions

    PS: le ":1" indique le nombre de bits, pas une valeur par défaut
    Euh, le "1" c'est 1, si l'on veut accéder à _alb, ça donnerait quoi justement ? moi je dirais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    function TMonObjet.Get_alb: Boolean;
    begin
      Result := (FFlags and 2) > 0;
    end;
     
    procedure Set_alb(Value: Boolean);
    begin
      if Value  then 
       FFlags :=  FFlags or 2
      else
       FFlags := FFlags and (not 2);
    end;
    le not 1 et not 2, va travailler sur quelle taille ? byte, word, long ???
    utiliser des constantes typées serait plus prudent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const
      _agcb : Cardinal  = 1; // 00000000 00000000 00000000 00000001b 
      _alb : Cardinal   = 2; // 00000000 00000000 00000000 00000010b
      _autre : Cardinal = 4; // 00000000 00000000 00000000 00000100b 
      _a2  : Cardinal   = 8; // 00000000 00000000 00000000 00001000b
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    il faut faire attention à l'ordre des bits

    on a 32 bits, le premier pour _agcb, le deuxième pour _alb et les 30 restants pour _gap.

    à priori c'est bon

    donc le getter de _gap c'est "FFlags shr 2" et le setter c'est "(Value shl 2) or FFlags and 3"
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 457
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 457
    Points : 24 870
    Points
    24 870
    Par défaut
    "shr 1" tu veux dire ?
    3 ? ça c'est quand les deux sont à true ? non ?
    Normalement avec les constantes cela fonctionne
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    "shr 1" tu veux dire ?
    3 ? ça c'est quand les deux sont à true ? non ?
    Normalement avec les constantes cela fonctionne
    quand on lit la valeur de gap, on veux virer les 2 booleans, donc shr 2
    quand on assigne gap, on garde 2 bits inchangés, donc 1 + 2
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Points : 49
    Points
    49
    Par défaut
    Merci pour ces précisions qui m'ont été précieuses, je vais tester tout ça cet après-midi

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

Discussions similaires

  1. enum et champs de bits
    Par FamiDoo dans le forum C++
    Réponses: 12
    Dernier message: 12/07/2006, 13h22
  2. Champs de bit et affectation
    Par the_ionic dans le forum C
    Réponses: 11
    Dernier message: 09/06/2006, 16h13
  3. Générer une dll 16 bits avec delphi 7
    Par chtiot dans le forum EDI
    Réponses: 4
    Dernier message: 21/02/2006, 18h50
  4. lire un champ de bit a partir d'un fichier
    Par loupdeau dans le forum MFC
    Réponses: 5
    Dernier message: 09/08/2005, 12h53
  5. [Delphi] Application 16/32 bits sous Delphi 2
    Par Cereal123 dans le forum API, COM et SDKs
    Réponses: 9
    Dernier message: 03/07/2004, 18h52

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