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

Free Pascal Discussion :

Usage du type ByteBool [Free Pascal]


Sujet :

Free 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 Usage du type ByteBool
    Bonjour !

    Passant de Turbo-Pascal à Free-Pascal, je découvre les possibilités offertes par ce dernier.
    Ainsi je voudrais bien utiliser le type ByteBool, mais le code que j'essaie ne marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var bb: ByteBool;
    begin
      bb := 1;
    end.
    Le compilateur me fait savoir qu'il a trouvé un "ShortInt" là où il s'attendait à un "ByteBool".

    En relisant le manuel, je ne vois toujours pas mon erreur.

    Free Pascal also supports the ByteBool, WordBool and LongBool types. These are of type Byte, Word or Longint, but are assignment compatible with a Boolean: the value False is equivalent to 0 (zero) and any nonzero value is considered True when converting to a boolean value.
    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
    Pas essayé, mais je suppose, que l'assignation en fonctionne qu'avec True et False. Par contre, dans l'évaluation d'expressions, le compilateur doit comparer si la valeur est 0 (équivalent sémantiquement à False) ou autre (équivalent à True).
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  3. #3
    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
    Citation Envoyé par wormful_sickfoot Voir le message
    Pas essayé, mais je suppose, que l'assignation en fonctionne qu'avec True et False. Par contre, dans l'évaluation d'expressions, le compilateur doit comparer si la valeur est 0 (équivalent sémantiquement à False) ou autre (équivalent à True).
    Mais la valeur, il faut bien l'assigner à un moment ou à un autre, non ?
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    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
    Ben oui, quand tu fais bb:= True ou bb := False. Si tu veux assigner un nombre à une variable c'est pas un type booléen qu'il faut utiliser, mais un type entier.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  5. #5
    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
    Citation Envoyé par wormful_sickfoot Voir le message
    Ben oui, quand tu fais bb:= True ou bb := False. Si tu veux assigner un nombre à une variable c'est pas un type booléen qu'il faut utiliser, mais un type entier.
    D'accord, mais dans ce cas quelle différence entre un ByteBool et un Boolean ?

    J'ai fini par trouver un exemple. Ce serait une sorte de type-fonction (?). Mais même en admettant cela, les résultats sont étranges.

    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
    var
      bb: bytebool;
    begin
      bb := False;
     
      bb := bytebool(3);
     
      writeln(bb);                      // TRUE
     
      writeln(bytebool(3));             // TRUE
     
      if bb then writeln('OK');         // OK
     
      if bytebool(3) then writeln('OK');// Rien !
     
      readln;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    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
    La doc FreePascal dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Name 	Size	Ord(True)
     
    Boolean 	1 	1
    ByteBool 	1 	Any nonzero value
    WordBool	2 	Any nonzero value
    LongBool 	4 	Any nonzero value
    Les types ByteBool, WordBool et LongBool stockent des variables booléennes surtout 1 ou plusieurs octets. Mais ca reste du booléen, donc les valeurs acceptables sont True ou False.

    Il se trouve que FreePascal introduit la possibilité qu'une variable numérique soit transtypées en booléen, auquel cas, si la valeur numérique est différente de 0, la variable booléenne prendra True, sinon elle prendra False. Ce comportement se rapproche du C.

    La notation que tu utilises dans l'exemple s'appelle transtypage, cela permet de changer le type d'une variable dans la durée d'une instruction. Tous les types (de bases) peuvent être utilisés pour un transtypage.

    Grâce à ce code, tu signale au compilateur de convertir la valeur numérique 3 en ByteBool... Comme 3 <>0 alors bb prend la valeur True.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  7. #7
    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
    Citation Envoyé par wormful_sickfoot Voir le message
    Il se trouve que FreePascal introduit la possibilité qu'une variable numérique soit transtypée en booléen, auquel cas, si la valeur numérique est différente de 0, la variable booléenne prendra True, sinon elle prendra False. Ce comportement se rapproche du C.

    La notation que tu utilises dans l'exemple s'appelle transtypage, cela permet de changer le type d'une variable dans la durée d'une instruction. Tous les types (de bases) peuvent être utilisés pour un transtypage.
    Voilà qui est intéressant ! Je ne connaissais pas cette notion. Merci pour ton explication.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    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
    Ça m'embête un peu de laisser la discussion dans cet état, parce que franchement, je ne trouve pas qu'elle soit résolue.

    D'abord il y a toujours le problème que j'ai signalé plus haut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if bytebool(3) then writeln('OK');// Rien !
    Ensuite, si le ByteBool ne peut prendre que deux valeurs, décidément je ne vois pas quelle différence il y a entre un ByteBool et un Boolean. Qu'est-ce qui empêche de "transtyper" directement le Byte en Boolean ?

    Et à quoi bon même "transtyper" si au bout du compte il ne s'agit que de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function toutSaufZero(n: Byte): Boolean;
    begin
      if n = 0 then toutSaufZero := false else toutSaufZero := true;
    end;
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  9. #9
    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
    Pour la première question, le transtypage ce n'est pas vraiment une fonction, juste une écriture. Après l'utiliser tel quel dans une comparaison, c'est peut-être un bug de FreePascal, mais ca n'a pas forcément un sens. Avis aux experts...

    La seule différence à mes yeux entre Boolean et ByteBool, c'est les valeurs qui vérifient la condition True. Selon la doc, pour boolean c'est uniquement 1, pour les autres ce sont toutes les valeurs différentes de 0. Mais ca reste un booléen, donc les valeurs possibles sont True ou False lors de l'assignation.
    M.Dlb - Modérateur z/OS - Rédacteur et Modérateur Pascal

  10. #10
    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
    Citation Envoyé par wormful_sickfoot Voir le message
    Pour la première question, le transtypage ce n'est pas vraiment une fonction, juste une écriture. Après l'utiliser tel quel dans une comparaison, c'est peut-être un bug de FreePascal, mais ca n'a pas forcément un sens. Avis aux experts...
    Merci pour ta patience, wormful_sickfoot.

    Le problème, c'est qu'on ne trouve pas d'exemple de la bonne façon de l'utiliser. Enfin, on ne va pas passer l'année là-dessus. De toute façon, j'ai renoncé à m'en servir. J'aime mieux utiliser du bon vieux langage que tous les compilateurs connaissent.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Bonjour,

    je pense que la différence essentielle entre Boolean et ByteBool c'est que seul le ByteBool est assurément sur 1 octet...Boolean l'est sûrement aussi mais ce n'est pas garanti.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    7 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 7 937
    Points : 59 416
    Points
    59 416
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    D'une manière plus générale et sans vouloir critiquer, dans la mesure où les processeurs 32 et, surtout, 64 bits génèrent des instructions plus longues et nécessitant parfois plus de cycles lorsqu'ils doivent manipuler des variables de 1 ou 2 octets, quel est objectivement l'intérêt de travailler avec des types tels que byte, bytebool, smallint, smallword, etc ?
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  13. #13
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    A ma connaissance ByteBool, WordBool et LongBool ont été introduit pour faciliter l'interfaçage (ça se dit ça ?) avec le C. Dans un programme pur pascal il vaut mieux utiliser Boolean.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 430
    Points
    28 430
    Par défaut
    Citation Envoyé par Alcatîz Voir le message
    Bonjour,

    D'une manière plus générale et sans vouloir critiquer, dans la mesure où les processeurs 32 et, surtout, 64 bits génèrent des instructions plus longues et nécessitant parfois plus de cycles lorsqu'ils doivent manipuler des variables de 1 ou 2 octets, quel est objectivement l'intérêt de travailler avec des types tels que byte, bytebool, smallint, smallword, etc ?
    c'est bien pour cela que la taille d'un Boolean n'est pas assurée sauf que pour tout ce qui accès fichier, échange réseau, etc... tu DOIS connaitre la taille de tes structures à l'octet prêt; pour cela il est préférable d'utiliser des types dont la taille est fixée.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  15. #15
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Janvier 2010
    Messages : 235
    Points : 506
    Points
    506
    Par défaut
    Sauf que d'après la doc (je n'ai pas testé) la taille d'un booléen est assurée. C'est 1 octet.

  16. #16
    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
    Nua,
    Citation Envoyé par batyann811 Voir le message
    Sauf que d'après la doc (je n'ai pas testé) la taille d'un booléen est assurée. C'est 1 octet.
    Oui, mais rien ne la garantit à terme, si les développeurs du compilateur changent d'avis.
    Si les cons volaient, il ferait nuit à midi.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/06/2014, 10h08
  2. programmation corba: le type "sequence"
    Par Kali dans le forum CORBA
    Réponses: 4
    Dernier message: 28/08/2005, 16h09
  3. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  4. utilisation du meta type ANY
    Par Anonymous dans le forum CORBA
    Réponses: 1
    Dernier message: 15/04/2002, 12h36

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