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 [04/05/2020 17:51] thierry [Parcourir un ensemble] |
prog:lazarus:types:enum [15/09/2024 13:15] (Version actuelle) thierry [Opérateur * pour verifier plusieurs membres du Set] |
||
|---|---|---|---|
| Ligne 55: | Ligne 55: | ||
| x:= GetEnumName(TypeInfo(TMonthType), Ord(i)); | x:= GetEnumName(TypeInfo(TMonthType), Ord(i)); | ||
| end; | end; | ||
| + | </code> | ||
| + | |||
| + | <code pascal> | ||
| + | var | ||
| + | vHandlerType: TDragManagerHandlerType; | ||
| + | begin | ||
| + | for vHandlerType := Low(TDragManagerHandlerTypee) to High(TDragManagerHandlerType) do | ||
| + | FreeThenNil(FDragManHandlers[vHandlerType]); | ||
| + | end; | ||
| </code> | </code> | ||
| == Passer d'un Type énuméré a un ordinale et réciproquement == | == Passer d'un Type énuméré a un ordinale et réciproquement == | ||
| Ligne 69: | Ligne 78: | ||
| 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 79: | 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> | ||