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

Flash Pascal Discussion :

Comportement de la fonction Ord


Sujet :

Flash Pascal

  1. #1
    Rédacteur/Modérateur

    Comportement de la fonction Ord
    Bonjour !

    J'aurais besoin de traduire une expression booléenne en une valeur entière, pour ranger des boutons sur deux colonnes en fonction de leur numéro.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    _x := 500 + 100 * Ord(index > 5)


    Mais le compilateur dans sa version actuelle (13.11.10) refuse cette écriture, et renvoie le message "Char expected". Pourtant, la fonction Ord() fonctionne aussi avec un type énuméré défini par l'utilisateur, comme on peut le voir dans l'exemple suivant. Enfin, ce qui est vraiment curieux, c'est le résultat qu'on obtient en remplaçant Ord(expression) par integer(expression).

    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
    (* Essai de la fonction Ord().
       FlashPascal 2 v13.11.10 *)
     
    program Ord;
     
    {$FRAME_WIDTH 550}
    {$FRAME_HEIGHT 400}
    {$FRAME_RATE 12}
    {$BACKGROUND $FFFFFF}
     
    uses
      Flash8;
     
    const
      m = 10;
     
    type
      tEnum = (a, b, c);
     
    var
      t: textField;
     
    begin
      t := textField.Create(nil, '', 0, m, m, stage.width - 2 * m, stage.height - 2 * m);
      t.text :=
      IntToStr(Ord('0')) + #10 +        // 48
      IntToStr(Ord(c)) + #10 +          // 2
      //IntToStr(Ord(false));           // Char expected
      IntToStr(integer(false)) + #10 +  // false
      IntToStr(integer(1 = 1));         // true
    end.


    Je sollicite humblement une correction de cette fonction pour la prochaine mise à jour.

    En attendant, y aurait-il une astuce pour faire la conversion d'une booléen en entier ?

  2. #2
    Expert éminent sénior
    alors en effet, Ord() est une rustine qui ne fait rien en fait

    les énumérés sont en fait de simples constantes numériques, donc Ord() est strictement équivalent à Integer() dans ce cas...ça ne génère aucun code spéficique.

    ensuite, il accepte les Char, mais là encore il ne fait rien car Flash ne fait pas de distinction Byte/Char, donc '0' = 48, c'est IntToStr qui va le convertir en '48', Ord() est cependant réclamé par le compilateur car le Pascal est typé.

    il faudrait que je gère les boolean en fait, ils sont connus de Flash, c'est pour cela que tes deux derniers tests renvoient false et true au lieu de 0 et 1

    je te colle une version vite fait en PJ

    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur/Modérateur

    Merci Paul, pour le compilateur et pour les explications.

    Tant que nous sommes sur ce sujet, j'ai remarqué autre chose. Je voulais comparer deux valeurs d'un type énuméré : il est possible de vérifier l'égalité, mais pas la différence.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program enum1;
     
    type
      tEnum = (a, b, c);
     
    var
      e: tEnum;
      i: integer;
     
    begin
      e := b;
      if e = a then // Ok
        i := 0;
    end.


    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program enum2;
     
    type
      tEnum = (a, b, c);
     
    var
      e: tEnum;
      i: integer;
     
    begin
      e := b;
      if e > a then // Type mismatch
        i := 0;
    end.


    J'ai pu contourner le problème de la façon suivante.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    program enum3;
     
    type
      tEnum = (a, b, c);
     
    var
      e: tEnum;
      i: integer;
     
    begin
      e := b;
      if Ord(e) > Ord(a) then // Ok
        i := 0;
    end.


    Je marque la discussion comme résolue, puisqu'elle l'est en effet.

  4. #4
    Rédacteur/Modérateur

    Une dernière observation. Le code suivant donne un résultat inattendu.

    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
    program IncChar;
     
    {$FRAME_WIDTH 550}
    {$FRAME_HEIGHT 400}
     
    uses
      Flash8;
     
    var
      t: textField;
      c: char;
     
    begin
      t := textField.Create(nil, '', 0, 0, 0, 550, 400);
      c := 'A';
      Inc(c, 32);
      t.text := c;
    end.


    Voilà, c'est tout pour aujourd'hui.

  5. #5
    Expert éminent sénior
    salut,

    je te soumets une nouvelle version, si tu n'as pas d'autres petits bugs et si tu veux bien tester qu'il n'y a pas d'effet de bord sur les autres codes existants (notamment les démos livrées avec), je mettrais tout cela sur le site officiel.

    Merci pour tes retours

    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
     
    (* Essai de la fonction Ord().
       FlashPascal 2 v13.11.10 *)
     
    program Q140227_ORD;
     
    {$FRAME_WIDTH 550}
    {$FRAME_HEIGHT 400}
    {$FRAME_RATE 12}
    {$BACKGROUND $FFFFFF}
     
    uses
      Flash8;
     
    const
      m = 10;
     
    type
      tEnum = (a, b, c);
     
    var
      t: textField;
      e: TEnum;
      k: Char;
    begin
      t := textField.Create(nil, '', 0, m, m, stage.width - 2 * m, stage.height - 2 * m);
      t.text :=
      IntToStr(Ord('0')) + #10 +        // 48
      IntToStr(Ord(c)) + #10 +          // 2
      IntToStr(Ord(false)) + #10 +      // Char expected
      IntToStr(integer(false)) + #10 +  // false
      IntToStr(integer(1 = 1));         // true
     
      e := b;
      if e > a then
        t.text := t.text + #10'e > a';
     
      k := 'A';
      Inc(k);
      Inc(k, 32);
      t.text := t.text + #10 + k;
    end.


    48
    2
    0
    0
    1
    e > a
    b
    
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Rédacteur/Modérateur

    D'accord Paul, ce sera fait.

  7. #7
    Rédacteur/Modérateur

    Voilà, j'ai testé tous les exemples du paquetage, plus quelques autres. Tout a l'air bon.

  8. #8
    Expert éminent sénior
    super merci, je publie tout cela bientôt.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Rédacteur/Modérateur

    J'ai trouvé autre chose. Il semble que les chaînes Unicode qui se trouvent dans les unités ne sont pas correctement traitées.

    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
    program TestWideChar;
     
    {$FRAME_WIDTH 300}
    {$FRAME_HEIGHT 200}
     
    uses
      Flash8, UWideChar;
     
    const
      C1 = "Hélène_C1"#10;
     
    function F1: string;
    begin
      result := "Hélène_F1"#10;
    end;
     
    var
      t: textField;
     
    begin
      t := textField.Create(_root, '', 0, 0, 0, stage.width, stage.height);
      t.text := C1 + F1 + C2 + F2;
    end.


    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
    unit UWideChar;
     
    interface
     
    const
      C2 = "Hélène_C2"#10;
     
    function F2: string;
     
    implementation
     
    function F2: string;
    begin
      result := "Hélène_F2"#10;
    end;
     
    end.

  10. #10
    Expert éminent sénior
    je n'ai pas bien compris...Flash ne travaille pas en Unicode mais uniquement en UTF8; j'ai introduit les doubles quotes qui forcent le passage de la chaîne dans la fonction UTF8Encode, ça évite d'avoir à faire un source en UTF8.

    Cependant si tu utilises un éditeur qui supporte l'UTF8 (Notepad++) tu peux compiler en simple quote du texte en UTF8 :

    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
     
    program TestWideChar;
     
    {$FRAME_WIDTH 300}
    {$FRAME_HEIGHT 200}
     
    uses
      Flash8, UWideChar;
     
    const
      C1 = 'Hélène_C1'#10;
     
    function F1: string;
    begin
      result := 'Hélène_F1'#10;
    end;
     
    var
      t: textField;
     
    begin
      t := textField.Create(_root, '', 0, 0, 0, stage.width, stage.height);
      t.text := C1 + F1 + C2 + F2;
    end.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  11. #11
    Rédacteur/Modérateur

    D'accord, autant pour moi. Je ne maîtrise pas bien ces histoires d'encodage. J'ai dit Unicode sans savoir : je voulais dire chaînes entre doubles guillemets. Effectivement, j'avais écrit l'unité de l'exemple ci-dessus dans Notepad++, sans avoir la curiosité de l'ouvrir dans l'éditeur de FlashPascal, ce que je viens de faire après avoir lu ton message : les chaînes étaient "mal écrites" dans le code source.

  12. #12
    Rédacteur/Modérateur

    Bonsoir Paul ! Le code suivant provoque une erreur. (J'utilise le dernier compilateur que tu as posté.)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    program CompareString;
     
    var
      s: string;
     
    begin
      if s = '1' then // type mismatch
        s := '1er';
    end.

  13. #13
    Expert éminent sénior
    oups, ah oui c'est ballot

    corrigé en version 14.03.15 publié ce jour
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  14. #14
    Rédacteur/Modérateur

    Citation Envoyé par Paul TOTH Voir le message
    oups, ah oui c'est ballot

    corrigé en version 14.03.15 publié ce jour
    Merci, Paul ! Je vais y jeter un œil tout de suite.