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

Delphi Discussion :

Boolean = -1


Sujet :

Delphi

  1. #1
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Points : 158
    Points
    158
    Par défaut Boolean = -1
    bonjour, excusez-moi pr ce post, mais une question me vient à la suite d'un problème de test,
    j'ai une variable boolean, que j'initialse a true je fais ensuite directement if(test) mais il ne l'a prend pas pcq en réalité elle vaut -1
    je n'ai rien modifié dans les valeurs de true ou false
    qq'un saurait-il pq ????

  2. #2
    Membre actif Avatar de Ultima
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    223
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2006
    Messages : 223
    Points : 261
    Points
    261
    Par défaut
    Bonjour,
    Tu peux montrer comment tu déclares ta variable, et comment tu l’initialises s’il te plaît ?
    Juste un petit bout de code ça ne peut pas faire de mal non ?

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,
    Teste ce bout de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var a,b:boolean;
    begin
     a:=true;
     b:=false;
     edit1.Text:=booltostr(a);
     edit2.Text:=booltostr(b);
     if a then edit1.Text:=edit1.Text+' OK';
     if b then edit2.Text:=edit2.Text+' Jamais écrit dans edit2.';
    end;
    Tu verras que La valeur de true -> est -1. (Ne pas tester avec -1)
    Mais pour voir ce que contient ta variable tu devrais faire menu "Exécuter", "Evaluer/modifier" (ou "inspecter"). Là tu verra true ou false.

    En complément de ce que demande Ultima, peux-tu aussi mettre le code du "if ..."
    A+, Hervé.

  4. #4
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Je voudrais savoir si cela génère une erreur?

    En effet, dans la majorité des langages de programmation, un booléen reste une variable de type numérique (pour Delphi, je ne pourrais tout de même pas l'affirmer à 100%)

    Le résultat "true" ou "false" est en fait la résultante de ce précept:
    - Si la variable a une valeur égale à 0, alors c'est false,
    - Si la variable a une valeur différente de 0, alors c'est true (ce qui implique que 1, 61 ou 5453 représente un booléen vrai)

  5. #5
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    je ne connaissais pas BoolToStr

    Mais ce n'est qu'une fonction pour visualiser un booléen.
    Physiquement, un booléen est une valeur ordinale qui prendre les valeurs 0 (false) et 1 (true).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IntToStr( Ord( MonBool ) )
    pour tester

    bizzare que booltostr renvoie un -1 pour true (mais l'aide le dit bien)

  6. #6
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Effectivement, ce que je montre avec BoolToStr c'est uniquement pour expliquer et montrer. On ne teste pas avec, d'ou ma remarque (Ne pas tester avec -1).
    Mihalis ne nous a pas indiqué comment il regardait sa variable. Je cherchais simplement comment il avait pu faire.
    A+, Hervé.

  7. #7
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour

    bizzare que booltostr renvoie un -1 pour true (mais l'aide le dit bien)
    Pas tant que ça, -1 correspond à un mot avec tous les bits à 1.

  8. #8
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 660
    Points : 25 444
    Points
    25 444
    Par défaut
    Vous devriez tous faire F1 sur BooltoStr, et vous verrez que tout est normal !

    Ensuite, pourquoi -1, là c'est mystère, même dans les DFM c'est stocké en chaine True/False !

  9. #9
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    Citation Envoyé par Graffito
    Bonjour


    Pas tant que ça, -1 correspond à un mot avec tous les bits à 1.

    bien vu

    mais un peu tiré par les cheveux, car pourquoi choisir de signer le nombre ?
    Ca aurait pu être Max( Word ) ou Max( LongWord), bon, le -1 permet de faire abstraction de cette manière de la longueur de l'entier (16,32,64 bits...), c'est vrai, c'est plus pratique de signer...
    Ca sent les compatibilités ancestrales tout ca.

    En attendant, Ord( True ) = 1 et pas -1

    @ShaiLeTroll
    bah oui, je suppose que l'on a tous fait F1
    on discute voila tout

  10. #10
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    tiens, je pensais plutôt que -1 = FFFFFFFF !!!

  11. #11
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par TicTacToe
    bien vu
    mais un peu tiré par les cheveux, car pourquoi choisir de signer le nombre ?
    Car tout booléen qui se respecte est un numérique qui vaut 0 pour false et une valeur différente de 0 pour true, sans que cette valeur soit forcément 1 (c'est typiquement un résonnement "humain" de se dire que false = 0, true = 1, ce qui n'est pas du tout logique pour nos petite machine siliciumées)...

  12. #12
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    @Tourlourou
    personne n'a dit le contraire

    @Gaadek
    Oui ca peut être une norme, pour nos cerveaux, mais moins pour une machine.
    Un booléen a 2 états, peut être considéré comme un entier sur une base 2.
    Tout ca dans le but de simplifier les opérations booléennes (or, not, xor et cie).

    si un true vaut 3 et un autre true vaut 4, les opérations booléennes seraient délicates
    -> (je ne parle pas des opérations bits à bit qui revienne à la convention 0-1 pour le true/false...) !.
    donc aucune logique de valoriser un true avec des valeurs différentes entre elles mais différentes de 0.

    donc c'est vrai que le -1 (symbolisant tous les bits à 1) vaut aussi bien que le 1, qui est le successeur de 0 dans une base 2. Après c'est une question d'habitude.
    enfin, c'est mon avis ^^

  13. #13
    Membre habitué
    Inscrit en
    Juin 2005
    Messages
    207
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 207
    Points : 161
    Points
    161
    Par défaut
    Citation Envoyé par TicTacToe
    @Tourlourou
    personne n'a dit le contraire

    @Gaadek
    Oui ca peut être une norme, pour nos cerveaux, mais moins pour une machine.
    Un booléen a 2 états, peut être considéré comme un entier sur une base 2.
    Tout ca dans le but de simplifier les opérations booléennes (or, not, xor et cie).

    si un true vaut 3 et un autre true vaut 4, les opérations booléennes seraient délicates
    -> (je ne parle pas des opérations bits à bit qui revienne à la convention 0-1 pour le true/false...) !.
    donc aucune logique de valoriser un true avec des valeurs différentes entre elles mais différentes de 0.

    donc c'est vrai que le -1 (symbolisant tous les bits à 1) vaut aussi bien que le 1, qui est le successeur de 0 dans une base 2. Après c'est une question d'habitude.
    enfin, c'est mon avis ^^
    Sauf que la gestion mémoire d'un bit n'existe pas à proprement parler, mais est toujours gérée sous forme d'octet...

  14. #14
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 879
    Points : 11 373
    Points
    11 373
    Billets dans le blog
    6
    Par défaut
    @ TicTacToe : la prochaine fois, je réfléchirai, promis !

  15. #15
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    En Delphi, il existe quatre types de valeurs booléennes. Il s'agit des quatre types suivants :
    • boolean (1 octet, non signé) : sa valeur vaut soit 0 (False), soit 1 (True) ; jamais une autre valeur ;
    • ByteBool (1 octet, signé) : sa valeur vaut soit 0 (False), soit autre chose (True) ;
    • WordBool et LongBool, comme ByteBool mais sur 2 et 4 octets respectivement.
    Je travaille actuellement intensivement sur la structure interne des types Delphi, donc j'en sais quelque chose

  16. #16
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    le différent de 0 est une facilité pour les humains je pense.
    Informatiquement, le stockage est autre.
    (l'aide Delphi dit bien '<>0' = True).

    Mais un petit test dessus, confirme que les booléen sont soit
    - comme graffito le faisait remarquer avec des 1 sur tous les bits (pour ByteBool)
    - des ordinaux en base 2, 0/1. donc sous utilisés par rapport à la capacité mémoire de stockage (élément de base = octet ou mot). (pour Boolean)

    Quelques petits test avec ByteBool:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
       b: ByteBool;
    begin
         b := True;
         ShowMessage( IntToStr( Ord( b ) ) );
    end;
    --> le résultat affiche '-1'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
       b: ByteBool;
    begin
         b := ByteBool( 43 );
         ShowMessage( IntToStr( Ord( b ) ) );
    end;
    --> le résultat affiche '-1'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var
       b: ByteBool;
    begin
         b := ByteBool( 43 );
         ShowMessage( IntToStr( Integer( b ) ) );
    end;
    --> le résultat affiche '-1'

    Par contre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    var
       b: ByteBool;
       c: Integer;
    begin
         c := 43;
         ShowMessage( IntToStr( Integer( ByteBool( c ) ) ) );
    end;
    --> le résultat est '43'.
    Le support de stockage de c est Integer. physiquement, la valeur reste 43.


    donc dès l'affectation, quelque soit l'affectation à b différent de 0, au final, b se retrouve avec une valeur à -1 (tous les bits à 1).
    moi ca me parait logique

    Qu'en pense-tu Sjrd ?

    (en tout cas, je ne connaissais pas les ByteBool et compagnie, on en apprends tous les jours )

    en fait, il faudrait faire un dump de la mémoire, juste après l'affectation
    b := BytBool( 43 )
    et voir réellement sa valeur.

  17. #17
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Points : 158
    Points
    158
    Par défaut
    bonjour, mon code est tout simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    var test:boolean;
    begin
    test:=true;
    showmessage(booltostr(test));
    il me renvoie donc bien -1
    je trouve ca très étrange

  18. #18
    Membre expert
    Avatar de TicTacToe
    Inscrit en
    Septembre 2005
    Messages
    1 940
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 940
    Points : 3 575
    Points
    3 575
    Par défaut
    sur BoolToStr

    et c'est normal, la fonction est comme ca, et a pris comme convention le '-1' pour 'True'
    Ctrl-Clic sur BoolToStr, pour voir le code de cette fonction, le True est associé à la chaine '-1'...

  19. #19
    Membre habitué
    Inscrit en
    Avril 2003
    Messages
    316
    Détails du profil
    Informations forums :
    Inscription : Avril 2003
    Messages : 316
    Points : 158
    Points
    158
    Par défaut
    je trouve ca qd meme bizarre comme convention mais bon
    sinon merci pr le ctrl clic

  20. #20
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Citation Envoyé par TicTacToe
    Qu'en pense-tu Sjrd ?
    Je ne m'étais pas fié à ce que raconte l'aide, c'est trop imprécis. Ce qui fonctionne vraiment, c'est aller voir le code source de System.pas et TypInfo.pas, puis jouer avec les RTTI.

    Le fait que Ord(True) vaille -1 pour les XXXBool, c'est normal : True est une constante qui vaut -1 dans ce cas. Mais de fait un 43 affecté donnera une valeur vraie, stockée comme 43.

    Sauf qu'en exécutant le code suivant, tu verras que boolean n'accepte que 0 ou 1, tandis que ByteBool est conciliant à toutes valeurs. Bien que le compilateur, lorsqu'il peut simplifier à la compilation, lui affecte -1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    var MyByteBool : ByteBool;
        MyBool : boolean;
        MyByte : Byte;
     
    MyByteBool := ByteBool(43);
    MyBool := MyByteBool;
    WriteLn('MyByteBool'#9'= ByteBool(43)'#9#9'= ', Ord(MyByteBool));
    WriteLn('MyBool'#9#9'= MyByteBool'#9#9'= ', Ord(MyBool));
     
    MyByte := 43;
    MyByteBool := ByteBool(MyByte);
    MyBool := MyByteBool;
    WriteLn('MyByteBool'#9'= ByteBool(MyByte)'#9'= ', Ord(MyByteBool));
    WriteLn('MyBool'#9#9'= MyByteBool'#9#9'= ', Ord(MyBool));
    Ce qui affiche :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    MyByteBool      = ByteBool(43)          = -1
    MyBool          = MyByteBool            = 1
    MyByteBool      = ByteBool(MyByte)      = 43
    MyBool          = MyByteBool            = 1

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. interpretation d'un boolean
    Par voyageur37 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 19/11/2004, 10h51
  2. Comment créer un champs " BOOLEAN " dans ACCESS ?
    Par Didier100 dans le forum Bases de données
    Réponses: 3
    Dernier message: 21/10/2004, 11h15
  3. [C#] Comment passer un paramètre Boolean au service Web ?
    Par ramalho dans le forum Services Web
    Réponses: 3
    Dernier message: 07/06/2004, 17h31
  4. pb avec la fonction boolean sur eclipse
    Par mcay dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 31/05/2004, 09h37
  5. [conversion][boolean]
    Par nenoeil dans le forum Langage
    Réponses: 10
    Dernier message: 12/05/2004, 11h19

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