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 Discussion :

PB avec le Sizeof d'un record


Sujet :

Delphi

  1. #1
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut PB avec le Sizeof d'un record
    Bonjour,

    Je cherche a faire tenir des informations d'un record dans un simple WORD sans succès, a chaque fois, le Sizeof me renvoi 5 la ou j’attendais un 2 !

    J'ai oublié un truc ou bien c'est impossible ?

    Voila les 2 versions testés de mon record.

    Version 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    TZone1 = packed record
        Altitude: 0..255;  // 8 bits
        Biomes: 0..15;     // 4 bits
        Riviere: 0..1;     // 1 bit
        Mortel: 0..1;      // 1 bit
        Inconnu: 0..3;     // 2 bits
      end;
    Version 2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    TZone2 = packed record
        case Word of
          0: (Data: Word);      // 16 bits
          1: (Altitude: 0..255; //  8 bits
              Biomes: 0..15;    //  4 bits
              Riviere: 0..1;    //  1 bit
              Mortel: 0..1;     //  1 bit
              Inconnu: 0..3);   //  2 bits
      end;
    Merci de vos retours.

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Delphi gère au minimum un Byte par champ, reproduit une strucure de type C avec des champs de bit possible doit se faire manuellement en Delphi à coup de SHR SHL ...

    Voir ce sujet : https://www.developpez.net/forums/d2...p-vers-delphi/
    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

  3. #3
    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 301
    Points
    11 301
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Peut-être un helper de Word permettrait-il d'émuler ce type ?
    Ou un Record avec des méthodes ?
    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 !

  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
    j'ai posté un exemple il n'y a pas très longtemps

    https://www.developpez.net/forums/d2...p-vers-delphi/
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Membre éprouvé Avatar de der§en
    Homme Profil pro
    Chambord
    Inscrit en
    Septembre 2005
    Messages
    765
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : Chambord
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2005
    Messages : 765
    Points : 960
    Points
    960
    Par défaut
    Merci de vos retours.

    J'ai finalement opté pour cette approche :

    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
      TZone3 = record
      private
        FData: Word;
        function  GetValue(const aIndex: Integer): Word; inline;
        procedure SetValue(const aIndex: Integer; const aValue: Word); inline;
      public
        property Altitude: Word index $0008 read GetValue write SetValue; // 8 bits, offset 0
        property Biomes:   Word index $0804 read GetValue write SetValue; // 4 bits, offset 8
        property Riviere:  Word index $0C01 read GetValue write SetValue; // 1 bits, offset 12
        property Mortel:   Word index $0D01 read GetValue write SetValue; // 1 bits, offset 13
        property Inconnu:  Word index $0E02 read GetValue write SetValue; // 2 bits, offset 14
      end;
     
    function TZone3.GetValue(const aIndex: Integer): Word;
    var
      Offset: Word;
      Mask: Word;
    begin
      Offset := aIndex shr 8;
      Mask   := (1 shl (aIndex and $FF)) - 1;
     
      Result := (FData shr Offset) and Mask;
    end;
     
    procedure TZone3.SetValue(const aIndex: Integer; const aValue: Word);
    var
      Offset: Word;
      Mask: Word;
    begin
      Offset := aIndex shr 8;
      Mask   := (1 shl (aIndex and $FF)) - 1;
     
      Assert(aValue <= Mask);
     
      FData := (FData and (not (Mask shl Offset))) or (aValue shl Offset);
    end;

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

Discussions similaires

  1. malloc sur char* (avec le sizeof d'un char[])
    Par fcjunic dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2011, 08h32
  2. Réponses: 0
    Dernier message: 19/02/2010, 11h27
  3. report .cfr avec un gros nombre de records
    Par dehian dans le forum Coldfusion
    Réponses: 1
    Dernier message: 18/08/2008, 11h20
  4. Problème avec malloc sizeof
    Par BATAK dans le forum Débuter
    Réponses: 10
    Dernier message: 06/04/2008, 12h21
  5. compatibilité des réels avec pascal (pour fichier de record)
    Par jacquesberger dans le forum Langage
    Réponses: 2
    Dernier message: 12/08/2005, 19h58

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