Set/fi
Deutsch · English · Français · Suomi · Русский
Johdanto
Joukko (Set) koodaa monia arvoja luetelluista tyypeistä (enumeration) järjestyksen (ordinal) omaaviin tyyppeihin.
Tarkastellaan esimerkiksi tätä lueteltua tyyppiä:
TSpeed = (spVerySlow,spSlow,spAVerage,spFast,spVeryFast);Ja tämä joukko:
TPossibleSpeeds = set of TSpeed;TPossibleSpeedsin kiinteät vakiojoukot määritellään niin että annetaan hakasulkujen sisällä joukkoon kuuluvat alkiot:
const
RatherSlow = [spVerySlow,spSlow];
RatherFast = [spFast,spVeryFast];RatherSlow ja RatherFast ovat joitakin TSpeed:n osajoukkoja.
Joukkojen käsittely
Kaksi funktiota on määritelty RTL:n System unit joita käytetään joukkojen käsittelemiseen Include(ASet,AValue) ja Exclude(ASet,AValue).
var
SomeSpeeds: TPossibleSpeeds;
begin
SomeSpeeds := [];
Include(SomeSpeeds,spVerySlow);
Include(SomeSpeeds,spVeryFast);
end;Joukkoja ei voida suoraan käsitellä, jos ne on julkaistu. Vaan on yleensä tehtävä paikallinen kopio, muutokset paikalliskopioon ja kutsutaan asettaja.
procedure TSomething.DoSomething(Sender: TFarObject);
var
LocalCopy: TPossibleSpeeds;
begin
LocalCopy := Sender.PossibleSpeeds; // getter to local
Include(LocalCopy,spVerySlow);
Sender.PossibleSpeeds := LocalCopy; // local to setter.
end;Varattua sanaa in käytetään testaukseen, onko arvo joukossa. Sitä käytetään esimerkiksi tällä tavalla:
var
CanBeSlow: Boolean;
const
SomeSpeeds = [Low(TSpeed)..High(TSpeed)];
begin
CanBeSlow := (spVerySlow in SomeSpeeds) or (spSlow in SomeSpeeds);
end;Bittimaskit
Joukkoja voidaan käyttää luomaan bittimaskeja kuten on esitetty esimerkissä.
(*
FLAG_A = 1; // 1 shl 0
FLAG_B = 2; // 1 shl 1
FLAG_C = 4; // 1 shl 2
*)
type
TFlag = (FLAG_A, FLAG_B, FLAG_C);
TFlags = set of TFlag;
var
Flags: TFlags;
[..]
Flags:= [FLAG_A, FLAG_C];
if FLAG_A in Flags then .. // check FLAG_A is set in flags variableFrom the Free Pascal wiki, page "Set/fi", as it stood on 2019-11-16 after a change by Djzepi, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's Licensing page. If you have concerns about this material, message the admin.