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

Langage Pascal Discussion :

Transtypage d'une variable de type enregistrement


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut Transtypage d'une variable de type enregistrement
    Bonjour !

    Dans un programme (d'échecs) j'ai le type TMove :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      TMove = record
        a, b: integer;
        promote: TPiece;
        bits: TMoveTypeSet;
      end;
    Un tableau déclaré comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gMoveArray: array[0..MAX_PLY - 1, 0..MAX_PLY - 1] of TMove;
    Au début de la procédure de recherche du meilleur coup, la variable gMoveArray est réinitialisée par le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      FillChar(gMoveArray, SizeOf(gMoveArray), 0);
    Dans le programme principal, pour savoir si un coup a été trouvé, le code actuel est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if longint(gMoveArray[0, 0]) = 0 then
    Malheureusement cette dernière ligne est refusée par plusieurs compilateurs, par exemple par Delphi 7 : "transtypage incorrect".

    La même technique est utilisée à d'autres endroits du programme. J'aimerais avoir un code qui est accepté par tous les compilateurs. Merci d'avance pour vos idées.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 464
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 464
    Points : 4 311
    Points
    4 311
    Par défaut
    Hello !

    La seule façon de procéder est d'écrire une fonction qui prend le record en entrée, qui effectue la bonne comparaison et qui renvoie un booléen.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Mei,
    Citation Envoyé par M.Dlb Voir le message
    Hello !

    La seule façon de procéder est d'écrire une fonction qui prend le record en entrée, qui effectue la bonne comparaison et qui renvoie un booléen.
    Ce n'est pas forcément la seule, mais c'est clairement la plus propre du point de vue programmation.

    Cependant, comme je suppose qu'elle est appelée fréquemment, ça risque de ralentir le programme. À voir
    Si les cons volaient, il ferait nuit à midi.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Merci pour vos réponses.

    Ailleurs dans le programme on compare un enregistrement à un autre. J'ai remplacé par la fonction CompareMem() : ça paraît fonctionner.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        //if longint(gMoveScoreArray[i].m) = longint(gMoveArray[0, gPly]) then
        if CompareMem(@gMoveScoreArray[i].m, @gMoveArray[0, gPly], SizeOf(TMove)) then
    Il est à noter que j'avais modifié le type TMove. Dans le code original, c'était comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      TMove = record
        a, b: shortint;
    Pour comparer avec un enregistrement vide (ou plutôt mis à zéro), est-ce que je peux aussi utiliser CompareMem() ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre averti

    Homme Profil pro
    Diverses
    Inscrit en
    Février 2014
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Diverses

    Informations forums :
    Inscription : Février 2014
    Messages : 122
    Points : 428
    Points
    428
    Par défaut
    A mon avis la solution avec CompareMem est à peine moins mauvaise que la bidouille du transtypage. Elle peut ne pas fonctionner s'il y a des octets non utilisés dans ton record. Ce qui peut arriver pour aligner les champs sur des adresses multiple de 4 par exemple. Tu peux eviter ce problème avec un packed record. Mais la solution d'une fonction inline me semble bien meilleure.

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 070
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 070
    Points : 15 454
    Points
    15 454
    Billets dans le blog
    9
    Par défaut
    Bien, je me range à votre avis.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function CompareMoves(const m1, m2: TMove): boolean;
    begin
      result := (m1.a = m2.a) and (m1.b = m2.b) and (m1.promote = m2.promote) and (m1.bits = m2.bits);
    end;
     
        //if longint(gMoveScoreArray[i].m) = longint(gMoveArray[0, gPly]) then
        //if CompareMem(@gMoveScoreArray[i].m, @gMoveArray[0, gPly], SizeOf(TMove)) then
        if CompareMoves(gMoveScoreArray[i].m, gMoveArray[0, gPly]) then
    Et du coup pour tester si la variable contient des données ou est à zéro j'ai fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          if (gMoveArray[0, 0].a = 0) and (gMoveArray[0, 0].b = 0) then
    Toujours à propos de transtypage, j'ai aussi un type TColor :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TColorWide = (cwWh, cwBl, cwNo); // Wh=White, Bl=Black, No=None
      TColor = cwWh..cwBl;
    Une fonction OtherColor() qui est écrite ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function OtherColor(aColor: TColor): TColor;
    begin
      result := TColor(integer(aColor) xor 1);
    end;
    Il faut savoir que le code en question est une adaptation du programme en C. La fonction se compile et donne le résultat attendu mais c'est encore du "bidouillage", non ? Donc il vaudrait mieux faire comme ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function OtherColor(const aColor: TColor): TColor;
    begin
      if aColor = cwWh then
        result := cwBl
      else
        result := cwWh;
    end;
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. [C++/CLI] Libérer une variable du type cli::array
    Par ekinox17 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 25/01/2006, 09h16
  2. Réponses: 1
    Dernier message: 21/12/2005, 19h08
  3. Réponses: 3
    Dernier message: 28/07/2005, 21h30
  4. affecter une variable de type stringstream
    Par sorari dans le forum SL & STL
    Réponses: 3
    Dernier message: 24/03/2005, 11h14
  5. Ajouter a une variable de type string, un entier
    Par Little-Freud dans le forum SL & STL
    Réponses: 12
    Dernier message: 05/03/2005, 19h33

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