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 :

Conversion d'un octet en ensemble


Sujet :

Langage Pascal

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut Conversion d'un octet en ensemble
    Bonjour !

    J'ai mis la main sur une version en Pascal du programme d'échecs TSCP (Tom Kerrigan's Simple Chess Program). Au cas où cela intéresserait quelqu'un, voici le lien vers cette version en Pascal : TSCPPAS.ZIP

    Il y a un endroit du programme que je ne comprends pas trop.

    Voici la déclaration du type TCastlePermissions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    type
      TCastlePermission = (AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside);
      TCastlePermissions = set of TCastlePermission;
    Voici la constante castle_mask :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
      castle_mask: array[0..63] of byte = (
         7, 15, 15, 15,  3, 15, 15, 11,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        13, 15, 15, 15, 12, 15, 15, 14
        );
    Maintenant, on a une variable castle de type TCastlePermissions, dont la valeur est modifiée de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    castle := castle - TCastlePermissions(castle_mask[m.from]) - TCastlePermissions(castle_mask[m.ToNdx]);
    Ce que je comprends pas, c'est le rapport qu'il y a entre une valeur de type Byte et une valeur de type set of TCastlePermission.

    Il est à noter que le code se compile sans problème avec Delphi 7 et avec Virtual Pascal. En revanche Free Pascal le refuse :

    board.pas(595,22) Error: Illegal type conversion: "Byte" to "TCastlePermissions"
    board.pas(595,64) Error: Illegal type conversion: "Byte" to "TCastlePermissions"
    Pourriez-vous m'éclairer un peu (et éventuellement me donner une solution pour pouvoir compiler avec Free Pascal) ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 557
    Points : 3 940
    Points
    3 940
    Par défaut
    Salut Roland

    Si je me souviens bien, pas le temps de chercher, un ensemble est une suite de bits contigus (dont la taille dépend de l'énuméré sous-jacent).
    Ton tableau de constantes représente donc des configurations d'ensembles prédéfinies.
    Les opérations réalisées font donc des opérations bit à bit, tu peux transforme le code sur les énumérés par des opérations bit à bit (and, or, not) comme on le ferait en langage C :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var
      b: Byte;
    begin
      b := Byte(castle) and (not castle_mask[m.from]) and (not castle_mask[m.ToNdx]);
    End;
    une solution consiste aussi à écrire une fonction de conversion explicite (pas testée):

    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
     
    function Byte2CastlePermissions(b: Byte): CastlePermissions;
    var
      i : TCastlePermission;
      p: Byte;
    begin
      Result := [];
      p := 1;
      for i := Low(TCastlePermission) to High(TCastlePermission) do
      begin
        if ((p and b) = p) then
          Include(Result, i);
        p := 2 * p; // on voir pourquoi la conversion est hasardeuse,si le nombre d'énumérée est trop grand, on explose la capacité d'un byte.
      end;
    End;
    Au sujet du refus par FreePascal, peut être est-ce dû au typage statique et au fait que, dans l'absolu, une telle conversion ne peut pas toujours aboutir (taille de l'ensemble en mémoire dépendant de l'énuméré)

    Appronfondis en lisant la doc, pas trop le temps ce matin.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    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
    Citation Envoyé par Roland Chastain Voir le message
    Bonjour !
    Ce que je comprends pas, c'est le rapport qu'il y a entre une valeur de type Byte et une valeur de type set of TCastlePermission.
    Aucun rapport, sauf quand on fait des trucs de cochons comme l'auteur de ton programme.

    Normalement castle_mask aurait du être défini comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    castle_mask: array[0..63] of TCastlePermissions
    Je suppose que castle_mask a été défini comme un tableau de byte soit pour contourner une limitation de TurboPascal (mais j'en doute) soit pour taper moins de code.

    As tu essayé de compiler en mode tp ? FreePascal accepte peut être ce genre de bidouilles dans ce mode.

    Néanmoins le mieux est de corriger cette mauvaise définition à mon avis. Pour ça tu vas devoir retrouver à quel ensemble correspond chaque valeur du tableau. Ensuite tu donnes le bons type au tableau et l'initialise comme il faut.

    Ce programme devrait pouvoir t'aider :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    program Castle;
     
    {$mode TP}
     
    type
      TCastlePermission = (AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside);
      TCastlePermissions = set of TCastlePermission;
     
    const
      castle_mask: array[0..63] of byte = (
          7, 15, 15, 15,  3, 15, 15, 11,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          13, 15, 15, 15, 12, 15, 15, 14
          );
     
      castle_perm_string : array [TCastlePermission] of String = ('AllowWhiteKingSide', 
        'AllowWhiteQueenSide', 'AllowBlackKingSide', 'AllowBlackQueenside');
    var
      I : Integer;
      P : TCastlePermission;
      Premier : Boolean;
    begin
      for I := 0 to 63 do
      begin
        Premier := true;
        Write('castle_mask[', I, '] = [');
        for P := Low(TCastlePermission) to High(TCastlePermission) do
        begin
          if P in TCastlePermissions(castle_mask[I]) then
          begin
            if not Premier then Write(', ');
     
            Write(castle_perm_string[P]);
            Premier := false;
          end;
        end;
        WriteLn('];');
      end;
    end.
    Il fonctionne sous FreePascal mais tu devrais idéalement l'utiliser sous Turbo Pascal car je ne sais pas si FreePascal et Turbo Pascal utilise la même représentation binaire des ensembles.

  4. #4
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Merci pour vos réponses (que je vais prendre le temps d'étudier) : ça fait plaisir.

    D'après les renseignements que j'ai pu trouver, le programme aurait été écrit pour Delphi 5. Apparemment c'est un travail inachevé. On ne peut même pas jouer, la conversion de la chaîne saisie n'étant pas faite comme il faut ! Voici la correction à appliquer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        (*
        from := Ord(s[1]) - Ord('a');
        Inc(from, 8 * (8 - Ord(s[2]) - Ord('0')));
        ToNdx := Ord(s[3]) - Ord('a');
        Inc(ToNdx, 8 * (8 - Ord(s[4]) - Ord('0')));
        *)
     
        from := 8 * (7 - Ord(s[2]) + Ord('1')) + Ord(s[1]) - Ord('a');
        ToNdx := 8 * (7 - Ord(s[4]) + Ord('1')) + Ord(s[3]) - Ord('a');
    Le jeu de l'ordinateur semble fonctionner mais ça reste à voir, notamment en ce qui concerne les coups spéciaux.

    Voilà, j'étudie vos suggestions et reviens vers vous très vite.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  5. #5
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 557
    Points : 3 940
    Points
    3 940
    Par défaut
    Je partage à moitié l'avis de Yamer, le but de l'auteur était sans doute de bénéficier à la fois des énumérés pour la lisibilité et le tableau de byte pour la déclaration directe en constante. L'inconvénient du choix de l'auteur du programme réside dans les conversions de données répétitives et visiblement condamnées dans Free Pascal, on perd en clarté.

    Ce type de code peut avoir du sens si tu enregistres un ensemble dans une base SQL ou un fichier binaire (par un fichier typé de Pascal).

    Transformer le type du tableau comme proposé par Yamer est une excellente idée, il faut initialiser le tableau dans une procédure au démarrage de ton programme.

    La conversion de Byte vers TCastlePermissions peut se faire à l'aide de la routine que j'ai proposé ou manuellement en sachant que le bit à mettre à 1 dans l'équivalent mémoire de TCastlePermissions selon la valeur cp TCastlePermission est donné par Ord(cp). On a par exemple
    13 = 1 + 4 + 8 = 2^0 + 2^2 + 2^3 <=> [AllowWhiteKingSide, AllowBlackKingSide, AllowBlackQueenside]
    sur le même principe :
    * 15 <=> [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside]
    * 0 <=> []

    L'usage de ma routine est plus sûr je pense (en corrigeant la signature qui est fausse, je viens de le voir)

    Une autre solution consiste à se débarasser des énuméré et d'utiliser des cosntante entières avec des masques de bits (opérateurs and, or, not) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cpAllowWhiteKingSide : byte = 1;
    cpAllowWhiteQueenSide : byte = 2;
    cpAllowBlackKingSide : byte = 4;
    cpAllowBlackQueenside : byte =8;
    C'est plus explicite.

    C'est clair?

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  6. #6
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    @e-ric

    Merci pour ces explications complémentaires. Oui, je crois que j'ai compris. Les exemples de conversion que tu donnes concordent d'ailleurs avec les résultats du petit programme proposé par yamer. Je crois que j'ai aussi compris ce que l'auteur du programme a voulu faire.

    Je suis en train d'équiper le programme de fonctions de débogage pour pouvoir m'assurer de la validité des données. Ensuite je vais tester les différentes solutions que vous avez proposées.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  7. #7
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 557
    Points : 3 940
    Points
    3 940
    Par défaut
    Coucou

    En rapport avec le programme fourni par Yamer:

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    program Castle;
     
    {$mode TP}
     
    type
      TCastlePermission = (AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside);
      TCastlePermissions = set of TCastlePermission;
     
    const
      castle_mask: array[0..63] of byte = (
          7, 15, 15, 15,  3, 15, 15, 11,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          15, 15, 15, 15, 15, 15, 15, 15,
          13, 15, 15, 15, 12, 15, 15, 14
          );
     
      castle_perm_string : array [TCastlePermission] of String = ('AllowWhiteKingSide', 
        'AllowWhiteQueenSide', 'AllowBlackKingSide', 'AllowBlackQueenside');
    var
      I : Integer;
      P : TCastlePermission;
      Premier : Boolean;
    begin
      for I := 0 to 63 do
      begin
        Premier := true;
        Write('castle_mask[', I, '] = [');
        for P := Low(TCastlePermission) to High(TCastlePermission) do
        begin
          if P in TCastlePermissions(castle_mask[I]) then
          begin
            if not Premier then Write(', ');
     
            Write(castle_perm_string[P]);
            Premier := false;
          end;
        end;
        WriteLn('];');
      end;
    end.
    Ne retombe-t-on pas sur le même problème (Conversion d'un byte vers un TCastlePermissions) ?

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  8. #8
    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
    Citation Envoyé par e-ric Voir le message
    Ne retombe-t-on pas sur le même problème (Conversion d'un byte vers un TCastlePermissions) ?
    Bien sûr mais ce programme est juste un outil à utiliser pour convertir une fois pour toutes les bytes du tableau en TCastlePermissions. A mon avis il faut choisir une voie et s'y tenir. Soit on utilise des ensembles soit des bytes avec des constantes entières. J'ai une préférence pour les ensembles qui donne à mon sens des programmes plus lisibles.

  9. #9
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 557
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 557
    Points : 3 940
    Points
    3 940
    Par défaut
    Les ensembles permettent un grand nombre de valeur : 256 en fait (soit des tableaux de 256 bits), ils peuvent être intéressants pour cela, ils facilitent grandement la lecture du code et laisse au compilateur le soin des calculs sur les masques binaires, c'est confortable. Mais il faut prendre des précautions si on veut enregistrer de telles données dans une base SQL par exemple.

    Tu as raison, il faut choisir une solution et s'y tenir.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  10. #10
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Grâce à vos explications, je viens de m'apercevoir qu'il y avait un problème de conception dans le programme. Il fait le contraire de ce qu'il faudrait ! Il conserve ce qu'il faudrait exclure, et exclut ce qu'il faudrait conserver. Voyez le code suivant, dans lequel on simule un mouvement au départ ou à destination de la case 0 (a8).

    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
    37
    38
    39
    40
     
    program TestCastle;
     
    {$MODE TP}
     
    type
      TCastlePermission = (AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside);
      TCastlePermissions = set of TCastlePermission;
     
    var
      castle: TCastlePermissions;
     
    const
      castle_mask: array[0..63] of byte = (
         7, 15, 15, 15,  3, 15, 15, 11,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        15, 15, 15, 15, 15, 15, 15, 15,
        13, 15, 15, 15, 12, 15, 15, 14
      );
     
    begin
      castle := [AllowWhiteKingSide..AllowBlackQueenSide]; 
      castle := castle - TCastlePermissions(castle_mask[0]); // ligne actuelle
      WriteLn(AllowBlackQueenSide in castle); // TRUE
      WriteLn(AllowWhiteQueenSide in castle); // FALSE
      // C'est le contraire du résultat logiquement attendu, puisqu'un mouvement sur
      // la case 0 (a8) devrait exclure la valeur "AllowBlackQueenSide".
     
      castle := [AllowWhiteKingSide..AllowBlackQueenSide];
      castle := castle * TCastlePermissions(castle_mask[0]); // correction
      WriteLn(AllowBlackQueenSide in castle); // FALSE
      WriteLn(AllowWhiteQueenSide in castle); // TRUE
      // C'est le résultat correct.
     
      ReadLn;
    end.
    Décidément, c'est la deuxième grosse erreur que je trouve.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  11. #11
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par yamer Voir le message
    Bien sûr mais ce programme est juste un outil à utiliser pour convertir une fois pour toutes les bytes du tableau en TCastlePermissions.
    Oui, d'accord, je n'avais pas vu ça comme ça. Effectivement, ton programme permet de fabriquer le code qui initialise un tableau de TCastlePermissions. Cette fois, j'ai compris. J'ai donc deux possibilités (avec la fonction proposée par e-ric).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  12. #12
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bien, j'ai opté pour la fonction mais je garde l'autre possibilité en réserve. Merci pour votre aide et pour cette discussion très instructive.

    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
    function CastlePermissions(const b: byte): TCastlePermissions;
    var
      p: TCastlePermission;
    begin
      result := [];
      for p := Low(TCastlePermission) to High(TCastlePermission) do
      begin
        if b and (1 shl Ord(p)) <> 0 then
          Include(result, p);
      end;
    end;
     
    function MakeMove(m: TMove): boolean;
    begin
      ...
      castle := castle * CastlePermissions(castle_mask[m.from]);
      castle := castle * CastlePermissions(castle_mask[m.ToNdx]);
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  13. #13
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Pour être tout à fait complet, j'ajoute que le tableau de TCastlePermissions peut être déclaré comme un tableau de constantes. Vous le saviez sûrement mais personnellement j'avais un doute. Voici donc ce que j'ai obtenu en modifiant légèrement le programme de yamer :

    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
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    program TestConstArray;
     
    {$IFDEF VPASCAL}
    {$PMTYPE VIO}
    {$ELSE}
    {$APPTYPE CONSOLE}
    {$ENDIF}
     
    type
      TCastlePermission = (AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside);
      TCastlePermissions = set of TCastlePermission;
     
    const
      CASTLE_PERMISSIONS: array[0..63] of TCastlePermissions = (
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteKingSide, AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside],
        [AllowWhiteQueenSide, AllowBlackKingSide, AllowBlackQueenside]
      );
     
    var
      ps: TCastlePermissions;
     
    begin
      ps := CASTLE_PERMISSIONS[0];
     
      WriteLn(AllowBlackQueenSide in ps); // FALSE
      WriteLn(AllowWhiteQueenSide in ps); // TRUE
     
      ReadLn;
    end.
    Du coup c'est cette solution-là que je vais retenir. Je tâcherai seulement de raccourcir un peu le nom des constantes.

    C'est beau le Pascal.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  14. #14
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Enfin, pour rendre justice à l'auteur de ce programme, je dois dire qu'il s'agissait juste (comme on l'apprend en lisant cette discussion) d'une adaptation rapide d'un code source en C, afin de comparer la vitesse d'exécution des deux programmes. C'est pourquoi également l'implémentation du protocole XBoard manque dans la version Delphi, à mon grand regret.

    Quand j'aurai fini de revoir le programme, je le posterai dans les sources.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  15. #15
    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
    Tu pourrais aussi envisager de changer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASTLE_PERMISSIONS: array[0..63] of TCastlePermissions
    en

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASTLE_PERMISSIONS: array[0..7, 0..7] of TCastlePermissions
    ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASTLE_PERMISSIONS: array[1..8, 1..8] of TCastlePermissions

  16. #16
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    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 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Merci pour la suggestion. C'est une bonne idée mais à ce moment-là il serait bon de faire la même modification partout dans le programme. Je vais y penser.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Conversion string en "octet"
    Par ben1015 dans le forum MATLAB
    Réponses: 5
    Dernier message: 01/02/2012, 22h29
  2. Conversion de deux octets en un short
    Par Kingdomofh dans le forum Développement
    Réponses: 4
    Dernier message: 27/04/2007, 10h31
  3. Conversion chaine en octets correspondant
    Par Yanux dans le forum Delphi
    Réponses: 2
    Dernier message: 30/09/2006, 20h01
  4. Conversion float -> n octets
    Par Fabllot dans le forum C
    Réponses: 4
    Dernier message: 22/05/2006, 20h00
  5. Conversion Byte en octets, Mo, Go
    Par elitost dans le forum Général Java
    Réponses: 7
    Dernier message: 27/09/2005, 13h48

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