Précédent   Forum du club des développeurs et IT Pro > Autres langages > Pascal > Free Pascal
Free Pascal Le compilateur Pascal multiplateforme
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 30/06/2012, 12h08   #1
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
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 :
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.

Citation:
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.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 12h11   #2
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 12h44   #3
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
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 ?
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 15h00   #4
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 15h15   #5
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
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 :
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.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/06/2012, 15h58   #6
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
La doc FreePascal dit:

Code :
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 30/06/2012, 17h22   #7
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
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.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2012, 11h49   #8
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
Ç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 :
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 :
1
2
3
4
function toutSaufZero(n: Byte): Boolean;
begin
  if n = 0 then toutSaufZero := false else toutSaufZero := true;
end;
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2012, 17h52   #9
M.Dlb
Rédacteur/Modérateur
 
Avatar de M.Dlb
 
Inscription : avril 2002
Messages : 2 275
Détails du profil
Informations personnelles :
Âge : 28

Informations forums :
Inscription : avril 2002
Messages : 2 275
Points : 3 392
Points : 3 392
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
M.Dlb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2012, 18h30   #10
Roland Chastain
Membre Expert
 
Homme Roland Chastain
Inscription : décembre 2011
Messages : 687
Détails du profil
Informations personnelles :
Nom : Homme Roland Chastain
Âge : 39
Localisation : Mali

Informations professionnelles :
Secteur : Enseignement

Informations forums :
Inscription : décembre 2011
Messages : 687
Points : 1 003
Points : 1 003
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.
__________________
L'Art est long et le Temps est court.
Roland Chastain est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2012, 20h45   #11
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 421
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 421
Points : 10 809
Points : 10 809
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
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2012, 12h58   #12
Alcatîz
Responsable Pascal

 
Avatar de Alcatîz
 
Homme Jean-Luc Gofflot
Ressources humaines
Inscription : mars 2003
Messages : 5 511
Détails du profil
Informations personnelles :
Nom : Homme Jean-Luc Gofflot
Âge : 46
Localisation : Belgique

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

Informations forums :
Inscription : mars 2003
Messages : 5 511
Points : 39 351
Points : 39 351
Envoyer un message via ICQ à Alcatîz Envoyer un message via MSN à Alcatîz Envoyer un message via Yahoo à Alcatîz Envoyer un message via Skype™ à Alcatîz
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
Tutoriels, exercices, FAQ, sources, compilateurs, outils, livres Pascal
Mes tutoriels et sources Pascal
FAQ Assembleur

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]
Alcatîz est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/07/2012, 13h44   #13
batyann811
Membre éprouvé
 
Homme
Inscription : janvier 2010
Messages : 223
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2010
Messages : 223
Points : 451
Points : 451
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.
batyann811 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2012, 15h51   #14
Paul TOTH
Expert Confirmé Sénior
 
Avatar de Paul TOTH
 
Homme Paul TOTH
Freelance
Inscription : novembre 2002
Messages : 4 421
Détails du profil
Informations personnelles :
Nom : Homme Paul TOTH
Âge : 43
Localisation : Réunion

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

Informations forums :
Inscription : novembre 2002
Messages : 4 421
Points : 10 809
Points : 10 809
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
Produits : UPnP, RemoteOffice, FlashPascal
Embarcadero : Ile de la Réunion, Dephi, C++Builder, RADPHP...TVA à 8,5%
Paul TOTH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 02/07/2012, 16h10   #15
batyann811
Membre éprouvé
 
Homme
Inscription : janvier 2010
Messages : 223
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 40
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : janvier 2010
Messages : 223
Points : 451
Points : 451
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.
batyann811 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/07/2012, 17h25   #16
droggo
Expert Confirmé
 
Inscription : août 2006
Messages : 3 417
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 3 417
Points : 3 772
Points : 3 772
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.
__________________
Il court en ce moment une espèce de grippe, mais elle ne court pas très vite, car on peut l'attraper sans courir.
droggo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 20h39.


 
 
 
 
Partenaires

Hébergement Web