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

Question sur une syntaxe


Sujet :

Langage Delphi

  1. #1
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 706
    Points : 5 326
    Points
    5 326
    Par défaut Question sur une syntaxe
    Bonjour,

    En regardant l'unité SuperObject (librairie pour faire du JSON avec Delphi 7) je suis tombé sur le type suivant :
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TByteChar = record
        case integer of
            0: (a, b: Byte);
            1: (c: WideChar);
        end;

    C'est utilisé comme ceci :
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    buf[0] := '\';
    buf[1] := 'u';
    buf[2] := super_hex_chars[TByteChar(c).b shr 4];
    buf[3] := super_hex_chars[TByteChar(c).b and $f];
    buf[4] := super_hex_chars[TByteChar(c).a shr 4];
    buf[5] := super_hex_chars[TByteChar(c).a and $f];

    buf et super_hex_chars sont défini comme ceci :
    Code Delphi : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    buf: array[0..5] of WideChar;
    super_hex_chars: PWideChar = '0123456789abcdef';

    Juste pour ma culture personnelle, j'aimerai comprendre ce que fait ce code.
    Je sais qu'il est utilisé pour convertir une valeur Unicode en sa traduction \u + Hexa + Hexa + Hexa + Hexa pour que le JSON le comprenne mais techniquement comment ça marche ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 743
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 743
    Points : 13 299
    Points
    13 299
    Par défaut
    Ce qui n'aide pas à la compréhension est ce c dans l'implémentation qui ne correspond pas au c de la déclaration de TByteChar. c est ici une variable widechar.

    Ce transtypage permet d'avoir accès aux deux octets du widechar séparément. Cela revient à faire des hi/lo sur un word.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    buf[2] := super_hex_chars[hi(word(c)) shr 4];
    buf[3] := super_hex_chars[hi(word(c)) and $f];
    buf[4] := super_hex_chars[lo(word(c)) shr 4];
    buf[5] := super_hex_chars[lo(word(c)) and $f];
    Mais vu la déclaration, il aurait été plus logique d'implémenter cela ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var
      bc :TByteChar;
     
    begin
      bc.c := 'A';
     
      buf[0] := '\';
      buf[1] := 'u';
      buf[2] := super_hex_chars[bc.b shr 4];
      buf[3] := super_hex_chars[bc.b and $f];
      buf[4] := super_hex_chars[bc.a shr 4];
      buf[5] := super_hex_chars[bc.a and $f];
    end;

  3. #3
    Expert confirmé
    Avatar de popo
    Homme Profil pro
    Analyste programmeur Delphi / C#
    Inscrit en
    Mars 2005
    Messages
    2 706
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste programmeur Delphi / C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 2 706
    Points : 5 326
    Points
    5 326
    Par défaut
    Oui, effectivement, c est un WideChar.
    La syntaxe hi(word(c) est plus facile à comprendre.

    Merci

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

Discussions similaires

  1. Question sur une syntaxe VBA
    Par Thomas_P dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 10/08/2011, 16h33
  2. Question sur une relation ternaire dans un MCD
    Par sylsau dans le forum Schéma
    Réponses: 5
    Dernier message: 05/03/2006, 20h00
  3. Réponses: 4
    Dernier message: 20/01/2006, 16h03
  4. [Newbies] Question sur une technologie XML a utiliser
    Par superraider dans le forum Windows
    Réponses: 3
    Dernier message: 21/10/2005, 10h01
  5. [jdbc] question sur une connection
    Par berg dans le forum JDBC
    Réponses: 2
    Dernier message: 10/09/2005, 08h29

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