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

Langage Delphi Discussion :

Taille d'un booléen sous Delphi


Sujet :

Langage Delphi

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Taille d'un booléen sous Delphi
    Bonjour,

    Est-il vrai que sous Delphi un booléen est codé sur un octet et non sur un bit ?

    Si Oui comment créer un tableau dynamique de bits ? Il semble que le type bit n'existe pas, les entiers débutant à Byte 0 à 255.

    Je ne vois pas l'utilité de multiplier par 7 la taille d'un tableau de booéens !

    Exemple : un tableau de bits (640,480) occupe 640*480=307200 bits ou 38400 octets le même en booléens occuperait 2457600 bits soit 307200 octets !!!

    Avez-vous une idée pour réduire la taille des tableaux de bits sous Delphi ?

    Mon application n'a besoin que de savoir si le pixel d'une image est occupé ou pas, bonjour pour les images de grande taille !

    Cordialement

    colorid

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Points : 51
    Points
    51
    Par défaut
    Citation Envoyé par colorid Voir le message
    Je ne vois pas l'utilité de multiplier par 7 la taille d'un tableau de booéens !
    Petite précision : pour passer d'un bit à un octet, on ajoute 7 bits mais on multiplie la taille par 8 ! Ce que vous démontrez parfaitement dans le calcul que vous faîtes après.

    Pourquoi ne pas créer vous-même une structure accueillant ces booléens/bits et les deux ou trois fonctions de base nécessaires pour y accéder ?

    Cordialement,

    Michel

  3. #3
    Membre éprouvé
    Avatar de Montor
    Homme Profil pro
    Autre
    Inscrit en
    Avril 2008
    Messages
    879
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Avril 2008
    Messages : 879
    Points : 963
    Points
    963

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    803
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 803
    Points : 182
    Points
    182
    Par défaut Ok et merci
    J'ignorais l'existence de TBits, elle n'est pas citée dans les variable de type entier ni dans Booléen...

    Bref le source suivant convient-il ?
    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
     
    procedure Machin;
    function OrderFrom_x_y(const x,y: integer): Integer;
    begin
      result:= x*y+y;
    end;
     
    procedure TForm1.FormCreate(Sender: TObject);
    var
      BitsTab: TBits;
      x,y: Integer;
    begin
      BitsTab:= TBits.Create;
      BitsTab.Size:= 640*480;
      for x:=0 to 639 do
        for y:= 0 to 479 do
          BitsTab[OrderFrom_x_y(x,y)]:= True;
    end;
    pour utiliser le pixels[x,y] s'il est actif il suffit d'écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if BitsTab[OrderFrom_x_y(x,y)]:= [OrderFrom_x_y] then
    N'y a t'il pas plus simple ?

  5. #5
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Salut

    Tu peux aussi utiliser des entiers comme une sorte de "tableaux de bits".
    Par exemple, un entier Byte est un tableau de 8 bits.
    Ex :
    Grace a un Byte, tu peux contenir 8 booleans. Pour connaitre la valeur du bit N, tu peux utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function IsBitSet (Entier, NoBit : Byte) : boolean;
    begin
      Result:=((Entier shr (NoBit-1)) and 1)<>0;
    end;
    Ensuite, pour savoir l'état du bit 3, on fait IsBitSet(Entier, 3).
    Voila, tu peux aussi utiliser des entiers plus grands. Mais pour une image de 640*480, tu peux te servir de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Array [0..639,0..59] of Byte;
    qui contient exactement le bon nombre de bits ...

    Voila, je ne sais pas si c'est plus simple ...

  6. #6
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    il n'existe pas de type "bit" car il n'y à pas de registre CPU de cette taille!

    les plus petits registre du CPU sont sur 8bits (al, ah, bl, bh, cl, ch, dl, dh).


    mais, comme un byte possede 8bits, qu'un word en possede 16, et qu'un longword en possede 32, il est facile de faire un tableau de "bit" grace à un tableau de "byte".

    on considerera que le tableau aura cette forme :

    TBits = array[0..n] of byte;

    mais que "virtuellement" il ressemble à cela :

    TBits = array[0..n, 0..7] of bit;


    ensuite pour acceder à chaque "bits" il suffit de jouer avec les shl, shr.

    bit 0 : Byte and $01
    bit 1 : (Byte shr 1) and $01
    bit 2 : (Byte shr 2) and $01
    bit 3 : (Byte shr 3) and $01
    etc.

    donc ici nous avons un rapport de 8.

    pour avoir 640x480 bits il suffit d'avoir un tableau de 640/8 x 480/8 bytes soit : 80x60 bytes

    mais! si il s'agit d'image (bmp, png, jpg) le mieux est d'utiliser TBitmap et ScanLine.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    il n'existe pas de type "bit" car il n'y à pas de registre CPU de cette taille!

    les plus petits registre du CPU sont sur 8bits (al, ah, bl, bh, cl, ch, dl, dh).


    mais, comme un byte possede 8bits, qu'un word en possede 16, et qu'un longword en possede 32, il est facile de faire un tableau de "bit" grace à un tableau de "byte".

    on considerera que le tableau aura cette forme :

    TBits = array[0..n] of byte;

    mais que "virtuellement" il ressemble à cela :

    TBits = array[0..n, 0..7] of bit;


    ensuite pour acceder à chaque "bits" il suffit de jouer avec les shl, shr.

    bit 0 : Byte and $01
    bit 1 : (Byte shr 1) and $01
    bit 2 : (Byte shr 2) and $01
    bit 3 : (Byte shr 3) and $01
    etc.

    donc ici nous avons un rapport de 8.
    Tout a fait d'accord, par contre :

    Citation Envoyé par Dr.Who Voir le message
    pour avoir 640x480 bits il suffit d'avoir un tableau de 640/8 x 480/8 bytes soit : 80x60 bytes
    Faux ! Parce qu'il a besoin de 640*480 bits, et un tableau de 80*60 Bytes contient 80*60*8 bits, soit 8 fois moins que voulu. Il faut diviser par 8 une seule composante de ton tableau, soit 80*480, ou 640*60 !

  8. #8
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Faux ! Parce qu'il a besoin de 640*480 bits, et un tableau de 80*60 Bytes contient 80*60*8 bits, soit 8 fois moins que voulu. Il faut diviser par 8 une seule composante de ton tableau, soit 80*480, ou 640*60 !

    ben oui ... (640*480) div 8 soit 307 200 shr 3
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  9. #9
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    ben oui ... (640*480) div 8 soit 307 200 shr 3
    Et ? 640*480 = 307 200 : il veut 307 200 bits, et pour un tableau 80*60 de Byte :
    80*60*8 = 38 400 : avec ton tableau, il a 38 400 bits

  10. #10
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par mick605 Voir le message
    Et ? 640*480 = 307 200 : il veut 307 200 bits, et pour un tableau 80*60 de Byte :
    80*60*8 = 38 400 : avec ton tableau, il a 38 400 bits
    oui pour la premiere erreur !

    640 div 8 * 480 div 8 = erreur 38 400 bits seulement avec byte, pas avec Int64 (80*60)*64 = 307 200 bits
    puisque 640/8 * 480/8 et egal a 640*480 / 8*8 (64)

    par contre

    (640*480) div 8 = 38 400 bytes! (38400*8 = 307 200)
    1 bytes = 8 bits

    en fait le nombre (38400) etait bon mais le reste pas ...
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  11. #11
    Membre chevronné

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Points : 1 765
    Points
    1 765
    Par défaut
    Citation Envoyé par Dr.Who Voir le message
    640 div 8 * 480 div 8 = erreur 38 400 bits seulement avec byte, pas avec Int64 (80*60)*64 = 307 200 bits
    Tricheur

  12. #12
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    pas de tricherie,
    pas d'adaptation.

    pas d'adaptation,
    pas d'évolution.

    pas d'évolution,
    pas de vie.

    pas de vie,
    reste le néant.


    j'ai vus le néant un jours ... il n'est pas trés bavard.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  13. #13
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 552
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 552
    Points : 3 918
    Points
    3 918
    Par défaut
    Pour ColorID

    Si tu veux connaître la taille d'un type de donnée, SizeOf est là pour te servir.

    Un boolean tient sur un octet, mais rien ne prouve que le compilateur n'est pas capable de réduire l'encombrement mémoire pour un tableau de boolean, fais le test avec SizeOf.

    Ceci dit, le fait de vouloir impérativement faire tenir un boolean sur un bit se paiera en efficacité car il faudra un calcul (comme montré dans les précédentes réponses) pour atteindre un n-ième bit.

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

Discussions similaires

  1. Taille d'une console sous linux
    Par Shinjuku dans le forum C
    Réponses: 7
    Dernier message: 13/06/2003, 12h44
  2. retrouver les compsants FASTNET sous Delphi 7
    Par fandor7 dans le forum Composants VCL
    Réponses: 4
    Dernier message: 11/06/2003, 18h11
  3. Comment créér une collection sous Delphi
    Par PsyKroPack dans le forum Langage
    Réponses: 6
    Dernier message: 11/02/2003, 13h20
  4. calcul sous delphi
    Par djedje-08 dans le forum Langage
    Réponses: 5
    Dernier message: 08/02/2003, 17h39
  5. Réponses: 4
    Dernier message: 27/03/2002, 11h03

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