Différences
Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
prog:lazarus:types:enum [03/05/2020 14:49] thierry [Set Of] |
prog:lazarus:types:enum [15/09/2024 13:15] (Version actuelle) thierry [Opérateur * pour verifier plusieurs membres du Set] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Enumération et Set Of====== | ====== Enumération et Set Of====== | ||
- | Source : [[https://wiki.lazarus.freepascal.org/Enumerated_types]] | + | |
===== Enumération ===== | ===== Enumération ===== | ||
+ | Ressources sur les énumérations: | ||
+ | * [[https://wiki.lazarus.freepascal.org/Enumerated_types]] | ||
==== Déclaration d'une énumération ==== | ==== Déclaration d'une énumération ==== | ||
Ligne 47: | Ligne 49: | ||
Retourne respectivement la plus grande valeur (December) ou la plus petite valeur (January) | Retourne respectivement la plus grande valeur (December) ou la plus petite valeur (January) | ||
==== Exemples de codes ==== | ==== Exemples de codes ==== | ||
- | ==== Parcourir un ensemble ==== | + | == Parcourir un ensemble == |
<code delphi> | <code delphi> | ||
for i := Ord(Low(TMonthType)) to Ord(High(TMonthType)) do | for i := Ord(Low(TMonthType)) to Ord(High(TMonthType)) do | ||
Ligne 54: | Ligne 56: | ||
end; | end; | ||
</code> | </code> | ||
+ | |||
+ | <code pascal> | ||
+ | var | ||
+ | vHandlerType: TDragManagerHandlerType; | ||
+ | begin | ||
+ | for vHandlerType := Low(TDragManagerHandlerTypee) to High(TDragManagerHandlerType) do | ||
+ | FreeThenNil(FDragManHandlers[vHandlerType]); | ||
+ | end; | ||
+ | </code> | ||
+ | == Passer d'un Type énuméré a un ordinale et réciproquement == | ||
+ | <code delphi> | ||
+ | var | ||
+ | vWS: integer; | ||
+ | begin | ||
+ | vWS := ord(wsFullScreen); //-> 4 | ||
+ | WindowState:=TWindowState(vWS); | ||
+ | end; | ||
+ | </code> | ||
+ | |||
===== Set Of ===== | ===== Set Of ===== | ||
Ressources sur les Set Of: | Ressources sur les Set Of: | ||
* [[https://www.tutorialspoint.com/pascal/pascal_sets.htm]] | * [[https://www.tutorialspoint.com/pascal/pascal_sets.htm]] | ||
+ | * [[https://pascal.developpez.com/cours/cyberzoide/?page=pg_Set]] | ||
+ | * [[https://wiki.freepascal.org/Set]] | ||
==== Déclaration d'une énumération + Set Of ==== | ==== Déclaration d'une énumération + Set Of ==== | ||
Ligne 67: | Ligne 90: | ||
TMonths = set of TMonth; | TMonths = set of TMonth; | ||
| | ||
- | </code> | + | </code> |
+ | ==== In ==== | ||
+ | on peut tester si un membre fait parti d'un SetOf avec l'operateur IN. | ||
+ | <code delphi> | ||
+ | Months: TMonths | ||
+ | ... | ||
+ | if January in Months then... | ||
+ | </code> | ||
+ | |||
+ | ==== Opérateur * pour verifier plusieurs membres du Set ==== | ||
+ | <code pascal> | ||
+ | if [csLoading,csDestroying,csDesigning]*ComponentState=[] then ... | ||
+ | </code> | ||
+ | |||
+ | ==== Include / Exclude ==== | ||
+ | <code pascal> | ||
+ | Include (FComponentState,csUpdating); | ||
+ | ... | ||
+ | Exclude(FComponentState,csUpdating); | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ==== Comprendre les sets ==== | ||
+ | === Comment sont ils stocké en mémoire ? === | ||
+ | |||
+ | D’après ce que j'ai compris les Sets sont en fait un masque de bits dont la longueur est égal au nombre d’élément dans l'ensemble de base (voir l'exemple ci dessous) | ||
+ | |||
+ | Le Set serait représenté par un ''Longint'' pour les ensembles de moins de 32 éléments.\\ | ||
+ | Et sur 32 Octets pour les ensembles de plus de 32 éléments.\\ | ||
+ | Ce qui nous ferais un nombre de 256 éléments maximum (Set Of Byte = OK / Set Of Word = Error)... | ||
+ | |||
+ | Donc cela implique qu'il n'est pas possible de connaitre facilement le nombre d’éléments dans un Set, il n'existe pas de length(Set) ou autre. | ||
+ | |||
+ | Un ''high(Set)'' sera égale a un ''high(Elements)'' | ||
+ | |||
+ | Exemple:\\ | ||
+ | avec l'ensemble ''TTest = (b1,b2,b3,b4)'' soit 4 éléments\\ | ||
+ | Le Set of ''TTests = set of TTest'' sera représenté par 4 bits d'un longint\\ | ||
+ | Donc ''vTests :=[b1,b4]'' sera representé par ''1001''\\ | ||
+ | Donc ''vTests :=[b2,b3]'' sera representé par ''0110''\\ | ||
+ | Donc ''vTests :=[]'' sera representé par ''0000''\\ | ||
+ | === Démo === | ||
+ | |||
+ | Petit programme de démo: | ||
+ | <code delphi> | ||
+ | program project1; | ||
+ | |||
+ | uses | ||
+ | sysutils; | ||
+ | |||
+ | type | ||
+ | TBit = (b0, b1, b2, b3, b4, b5, b6, b7); | ||
+ | TBits = set of TBit; | ||
+ | var | ||
+ | vS: string; | ||
+ | vBits: TBits; | ||
+ | pI: pinteger; | ||
+ | |||
+ | begin | ||
+ | vBits := []; //(00000000...) | ||
+ | pI := @vBits; // on "convertit" le Set en Integer | ||
+ | writeln(IntToStr(pI^)); // -> 0 | ||
+ | |||
+ | vBits := [b0]; //(10000000...) | ||
+ | writeln(IntToStr(pI^)); // -> 1 | ||
+ | |||
+ | vBits := [b1]; //(01000000...) | ||
+ | writeln(IntToStr(pI^)); // -> 2 | ||
+ | |||
+ | vBits := [b0, b1]; //(11000000...) | ||
+ | writeln(IntToStr(pI^)); // -> 3 | ||
+ | |||
+ | vBits := [b0, b7]; //(10000001...) | ||
+ | writeln(IntToStr(pI^)); // -> 129 | ||
+ | |||
+ | end. | ||
+ | </code> | ||
+ | === Passer d'un Integer en Set of === | ||
+ | Tout se passe dans la procedure ''IntAsSet'' ci-dessous... | ||
+ | <code delphi> | ||
+ | program project2; | ||
+ | |||
+ | uses | ||
+ | sysutils; | ||
+ | |||
+ | type | ||
+ | TBit = (b0, b1, b2, b3, b4, b5, b6, b7); | ||
+ | TBits = set of TBit; | ||
+ | var | ||
+ | vS: string; | ||
+ | vBits: TBits; | ||
+ | pI: pinteger; | ||
+ | |||
+ | procedure test(ABits: TBits); | ||
+ | var | ||
+ | //vBit: TBit; | ||
+ | vI: integer; | ||
+ | begin | ||
+ | for vI := Ord(low(TBit)) to Ord(high(TBit)) do | ||
+ | begin | ||
+ | if TBit(vI) in ABits then | ||
+ | writeln(IntToStr(vI) + ' = 1') | ||
+ | else | ||
+ | writeln(IntToStr(vI) + ' = 0'); | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | procedure IntAsSet(AInt: integer; PSet: pointer); | ||
+ | var | ||
+ | pI: pInteger; | ||
+ | begin | ||
+ | pI := PSet; | ||
+ | pI^ := Aint; | ||
+ | end; | ||
+ | |||
+ | |||
+ | begin | ||
+ | |||
+ | vBits := []; //(00000000...) | ||
+ | IntAsSet(255, @vBits); | ||
+ | test(vBits); | ||
+ | |||
+ | ReadLn(vS); | ||
+ | end. | ||
+ | </code> | ||