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 [07/05/2020 12:55] thierry [Comprendre les sets] |
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 81: | 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 ==== | ==== Comprendre les sets ==== | ||
- | 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. | + | === 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.\\ | 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.\\ | Et sur 32 Octets pour les ensembles de plus de 32 éléments.\\ | ||
- | Ce qui nous ferais un nombre de 256 éléments maximum (A vérifier)... | + | 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:\\ | Exemple:\\ | ||
Ligne 95: | Ligne 133: | ||
Donc ''vTests :=[b2,b3]'' sera representé par ''0110''\\ | Donc ''vTests :=[b2,b3]'' sera representé par ''0110''\\ | ||
Donc ''vTests :=[]'' sera representé par ''0000''\\ | Donc ''vTests :=[]'' sera representé par ''0000''\\ | ||
+ | === Démo === | ||
Petit programme de démo: | Petit programme de démo: | ||
Ligne 130: | Ligne 169: | ||
end. | end. | ||
</code> | </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> | ||
+ | |||