Discussion: Comportement de la fonction Ord [Flash Pascal]

  1. #1
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut 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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 723
    Points : 21 447
    Points
    21 447

    Par défaut

    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

    FlashPascal2.zip
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  3. #3
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 723
    Points : 21 447
    Points
    21 447

    Par défaut

    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
    
    FlashPascal2.zip
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  6. #6
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    D'accord Paul, ce sera fait.

  7. #7
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

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

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 723
    Points : 21 447
    Points
    21 447

    Par défaut

    super merci, je publie tout cela bientôt.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  9. #9
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 723
    Points : 21 447
    Points
    21 447

    Par défaut

    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
    Produits : UPnP, RemoteOffice, FlashPascal

  11. #11
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    novembre 2002
    Messages
    6 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : novembre 2002
    Messages : 6 723
    Points : 21 447
    Points
    21 447

    Par défaut

    oups, ah oui c'est ballot

    corrigé en version 14.03.15 publié ce jour
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Produits : UPnP, RemoteOffice, FlashPascal

  14. #14
    Rédacteur/Modérateur

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

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : décembre 2011
    Messages : 2 976
    Points : 10 604
    Points
    10 604
    Billets dans le blog
    4

    Par défaut

    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.

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

Discussions similaires

  1. Equivalent c# de la fonction ord et char
    Par oclone dans le forum Langage
    Réponses: 1
    Dernier message: 27/10/2008, 12h03
  2. comportement de la fonction strtok()
    Par Arronax dans le forum C++
    Réponses: 3
    Dernier message: 15/04/2008, 15h03
  3. Signification de la fonction Ord
    Par Mejdi_tn dans le forum Débutant
    Réponses: 4
    Dernier message: 27/03/2008, 11h31
  4. Problème avec la fonction ord() en mode graphique.
    Par bahamut100 dans le forum Débutant
    Réponses: 3
    Dernier message: 13/10/2007, 16h30
  5. Fonction ord, mais où es tu ?
    Par Neilos dans le forum C++Builder
    Réponses: 6
    Dernier message: 30/12/2003, 21h56

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