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 :

Traduction en Delphi d'une structure


Sujet :

Delphi

  1. #1
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Points : 2 306
    Points
    2 306
    Par défaut Traduction en Delphi d'une structure
    bonjour,

    comment écrire ceci en Delphi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct {
      int ObjType;			// object type
      int AddrHigh;			// object address - high byte
      int AddrLow;			// object address - low byte
      int Index;			// index address for object arrays
      union {
        long int I;			// object value - integer
        double D;			// object value - double/single
      } Val;
      int Exponent;			// object value - exponent
      int BitNumber;		// specific bit number
    } KN_OBJ;
    j'ai essayé avec Union, mais je n'y parviens pas.

    Merci,
    Dany

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut Édité
    Hao,

    Il faut faire un record avec des champs variables:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    type
      montruc = record
           ObjType : integer;			// object type
           ....
           BitNumber : integer;
           case bo : boolean of { par exemple }
             false : (I : integer);
             true : (D : double) )
            { end; du case . OUPS, il ne le faut pas !! }
      end ; { du record }
    Les champs variables doivent absolument être les derniers du record !!

    Dans ta variable de type montruc, tu mets le booléen bo à true ou false, ça t'aidera pour savoir quel champ tu utilises pour cette variable.

    (Ce n'est pas obligatoire, on aurait pu déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
           case boolean of { par exemple }
    ...
    et ne pas disposer de champ permettant au programme de savoir quel champ variable utiliser, c'est envisageable en étant très attentif sur l'emploi de ces champs. )

    Tout ça est du Pascal basique.

  3. #3
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    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
     
    type
     Val=record
      case byte of // le type importe peu, il sert juste à l'énumération ci-dessous
        0: (I:integer);
        1: (D:double);
      end;
     // pas de end ici !
     
     KN_OBJ=record
      ObjType:integer;
      AddrHigh:integer;
      AddrLow:integer;
      Index:integer;
      union:Val;
      Exponent:integer;
      BitNumber:integer;
     end;
     
    // NB: on est ici obligé de nommer l'union car elle n'est pas ne fin de record...
    // sinon on aurait pu écrire
     
     KN_OBJ=record
      ObjType:integer;
      AddrHigh:integer;
      AddrLow:integer;
      Index:integer;
      case byte of
        0: (I:integer);
        1: (D:double);
      end;
    // pas de end; ici !
    voir aussi mon site

  4. #4
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Comme dit droggo, le case <truc> of est un fondamental du langage Pascal.

    Ceci étant, en C, un champ union possède un nom (ici, Val). Il faut en tenir compte pour ne pas trop se prendre la tête dans le reste du code (de façon à ce que les affectations/références restent les mêmes). Si on utilise directement le "case of", ce nom disparaît.

    En outre, il y a un problème 16 bits/32 bits : l'utilisation de long int semblerait dire qu'on est dans un ancien code 16 bits, mais il peut aussi d'agir d'un résidu.

    Je proposerais donc plutôt ceci, pour conserver la syntaxe originale :

    Si le code original est pour un compilateur C 32 bits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type K_OBJ = record
                  ObjType   : Integer; // object type
                  AddrHigh  : Integer; // object address - high byte
                  AddrLow   : Integer; // object address - low byte
                  Index     : Integer; // index address for object arrays
                  Val : record
                         case Integer of
                          0 : (I : LongInt); // object value - integer
                          1 : (D : Double);  // object value - double/single
                        end;
                  Exponent  : Integer; // object value - exponent
                  BitNumber : Integer;// specific bit number
                 end;

    Si le code original est pour un (vieux) compilateur C 16 bits :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    type K_OBJ = record
                  ObjType   : SmallInt; // object type
                  AddrHigh  : SmallInt; // object address - high byte
                  AddrLow   : SmallInt; // object address - low byte
                  Index     : SmallInt; // index address for object arrays
                  Val : record
                         case Integer of
                          0 : (I : LongInt); // object value - integer
                          1 : (D : Double);  // object value - double/single
                        end;
                  Exponent  : SmallInt; // object value - exponent
                  BitNumber : SmallInt;// specific bit number
                 end;
    Edit : tothpaul, tu confonds nom de type et nom de variable.

  5. #5
    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 : 55
    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 457
    Points
    28 457
    Par défaut
    Citation Envoyé par CapJack

    Edit : tothpaul, tu confonds nom de type et nom de variable.
    j'ai toujours détesté le C

  6. #6
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Je te comprends...

  7. #7
    Membre émérite
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Points : 2 306
    Points
    2 306
    Par défaut
    bonsoir,

    merci à tous et désolé de vous avoir dé"rangé pour si peu.

    @++
    Dany

    ps : en plus j'ai mis union, je voulais dire case, vraiment désolé

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/04/2007, 16h14
  2. equivalent d'une structure en delphi
    Par pdgnr dans le forum Delphi
    Réponses: 7
    Dernier message: 19/09/2006, 15h16
  3. TRaduction C++ => Delphi VOID ??
    Par escafr dans le forum Langage
    Réponses: 6
    Dernier message: 20/02/2003, 11h39
  4. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 16h49
  5. longueur d'une structure
    Par bohemianvirtual dans le forum C
    Réponses: 6
    Dernier message: 28/05/2002, 19h31

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