Enum Arrays vs Sets

Ordinal Types as Array Subscripts

Constant-length arrays

Enumerations and custom range ordinal types can be used as array subscripts, allowing flexible customization of array index ranges.

Example: Enums as Array Subscripts

type
  // 1. Numeric range index 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 1-based index range 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. Custom ordinal type for array indexing
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. Enumeration type directly as array subscript (most common usage)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;
var
  AnimalNameArr: TAnimalNames;
begin
  AnimalNameArr[akDuck] := 'Duck';
  AnimalNameArr[akCat] := 'Cat';
  AnimalNameArr[akDog] := 'Dog';
end;
Code language: PHP (php)

IntToStr is a standard conversion function defined in the SysUtils unit. Purpose: Convert integer values to strings.

Full Demo Program

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

uses
  SysUtils; // Required unit for IntToStr

type
  // 1. Numeric range index 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. 1-based index range 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. Custom ordinal type for array indexing
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. Enumeration type directly as array subscript (most common usage)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;

var

  // Array with index range 0-9
  Arr0To9: TArrayOfTenStrings;

  // Array with 1-based index range 1-10
  Arr1To10: TArrayOfTenStrings1Based;

  // Array using custom ordinal index type
  ArrCustomIdx: TAlsoArrayOfTenStrings;

  // Loop variable of custom ordinal type TMyNumber
  I: TMyNumber;

  // Enumeration-indexed array variable
  AnimalNameArr: TAnimalNames;

begin

  // 1. Usage of array with 0~9 indexes
  Arr0To9[0] := 'Element No.0'; // Assignment
  Arr0To9[5] := 'Middle Element';
  Writeln(Arr0To9[0]); // Value retrieval

  // 2. Usage of 1-based array; index 0 cannot be accessed
  Arr1To10[1] := 'First Item';
  Arr1To10[10] := 'Last Item';
  Writeln(Arr1To10[10]);

  // 3. Iterate array indexed by custom ordinal TMyNumber
  for I := Low(TMyNumber) to High(TMyNumber) do
  begin
    ArrCustomIdx[I] := 'Index ' + IntToStr(I);
  end;

  Writeln(ArrCustomIdx[3]);

  // Assign values to enum-indexed array with enum literals as subscripts
  AnimalNameArr[akDuck] := 'Duck';
  AnimalNameArr[akCat] := 'Cat';
  AnimalNameArr[akDog] := 'Dog';
end.Code language: PHP (php)

Two compiler warnings generated

D:\fpcdemo>fpc mydemo.dpr
Free Pascal Compiler version 3.2.2 [2021/05/15] for i386
Copyright (c) 1993-2021 by Florian Klaempfl and others
Target OS: Win32 for i386
Compiling mydemo.dpr
mydemo.dpr(55,35) Warning: Implicit string type conversion from "AnsiString" to "UnicodeString"
mydemo.dpr(55,33) Warning: Implicit string type conversion with potential data loss from "UnicodeString" to "AnsiString"
Linking mydemo.exe
63 lines compiled, 0.2 sec, 68464 bytes code, 4276 bytes data
2 warning(s) issued

D:\fpcdemo>mydemo
Element No.0
Last Item
Index 3Code language: CSS (css)

Set Types

Sets, implemented internally as bit-fields

Sets are defined based on enumeration or ordinal types. They store a collection of enum values in bulk and support set arithmetic, element addition and removal.

{$ifdef FPC} {$mode objfpc} {$H+} {$endif}
{$codepage utf8}
program ArrayIndexDemo;

type
  TAnimalKind = (akDuck, akCat, akDog);
  // Define set type based on enumeration
  TAnimals = set of TAnimalKind;
var
  A: TAnimals;
begin
  A := [];                     // Empty set literal
  A := [akDuck, akCat];        // Direct assignment of multiple elements
  A := A + [akDog];            // Set union (add element)
  A := A * [akCat, akDog];     // Set intersection (retain shared elements)

  Include(A, akDuck);          // Built-in routine: add single element
  Exclude(A, akDuck);          // Built-in routine: remove single element
end.
Code language: PHP (php)

Common Set Operators & Routines

  1. []: Empty set literal
  2. +: Union, merge two groups of elements
  3. *: Intersection, retain elements present in both sets
  4. Include(Set, Element): Safely add an element
  5. Exclude(Set, Element): Safely remove an element

Previous:

Leave a Reply

Your email address will not be published. Required fields are marked *