Массивы перечислений и множества

Порядковые типы как индексы массивов

Массивы фиксированной длины Constant-length arrays

Перечислимые типы и пользовательские порядковые диапазоны можно использовать как индексы массивов, чтобы гибко задавать диапазоны индексов.

Ниже пример перечисления как индекса массива

type
  // 1. Обычный числовой диапазон индексов 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. Индексы с началом от единицы 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. Пользовательский порядковый тип для индекса массива
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. Перечислимый тип напрямую как индекс (самый распространённый случай)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;
var
  AnimalNameArr: TAnimalNames;
begin
  AnimalNameArr[akDuck] := 'Утка';
  AnimalNameArr[akCat] := 'Кошка';
  AnimalNameArr[akDog] := 'Собака';
end;
Code language: PHP (php)

IntToStr — стандартная функция преобразования, объявлена в модуле SysUtils. Назначение: преобразовать целое число в строку.

Полный пример

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

uses
  SysUtils; // Обязательно подключите для использования IntToStr

type
  // 1. Обычный числовой диапазон индексов 0~9
  TArrayOfTenStrings = array [0..9] of string;

  // 2. Индексы с началом от единицы 1~10
  TArrayOfTenStrings1Based = array [1..10] of string;

  // 3. Пользовательский порядковый тип для индекса массива
  TMyNumber = 0..9;
  TAlsoArrayOfTenStrings = array [TMyNumber] of string;

  // 4. Перечислимый тип напрямую как индекс (самый распространённый случай)
  TAnimalKind = (akDuck, akCat, akDog);
  TAnimalNames = array [TAnimalKind] of string;

var

  // Создать массив с индексами от 0 до 9
  Arr0To9: TArrayOfTenStrings;

  // Создать массив с индексами от 1 до 10
  Arr1To10: TArrayOfTenStrings1Based;

  // Создать массив с пользовательским порядковым индексом
  ArrCustomIdx: TAlsoArrayOfTenStrings;

  // Переменная I пользовательского порядкового типа TMyNumber
  I: TMyNumber;

  // Переменная массива перечислений
  AnimalNameArr: TAnimalNames;

begin

  // 1. Использование массива с индексами 0~9
  Arr0To9[0] := 'Элемент №0'; // Присвоение значения
  Arr0To9[5] := 'Средний элемент';
  Writeln(Arr0To9[0]); // Чтение значения

  // 2. Массив с индексами от единицы, доступ по индексу 0 запрещён
  Arr1To10[1] := 'Первый элемент';
  Arr1To10[10] := 'Последний элемент';
  Writeln(Arr1To10[10]);

  // 3. Обход массива через пользовательский порядковый тип TMyNumber
  for I := Low(TMyNumber) to High(TMyNumber) do
  begin
    ArrCustomIdx[I] := 'Индекс ' + IntToStr(I);
  end;

  Writeln(ArrCustomIdx[3]);

  // Пример заполнения массива перечислений через значения перечисления как индексы
  AnimalNameArr[akDuck] := 'Утка';
  AnimalNameArr[akCat] := 'Кошка';
  AnimalNameArr[akDog] := 'Собака';
end.Code language: PHP (php)

При компиляции появляются два предупреждения

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 строк скомпилировано, 0,2 сек, 68464 байт кода, 4276 байт данных
2 предупреждений выведено

D:\fpcdemo>mydemo
Элемент №0
Последний элемент
Индекс 3Code language: CSS (css)

Типы множеств

Sets, под капотом реализованы как битовые поля bit-fields

Множества объявляются на основе перечислимых или порядковых типов, хранят набор значений перечислений, поддерживают операции над множествами и добавление/удаление элементов.

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

type
  TAnimalKind = (akDuck, akCat, akDog);
  // Объявить тип множества на основе перечисления
  TAnimals = set of TAnimalKind;
var
  A: TAnimals;
begin
  A := [];                     // Пустое множество
  A := [akDuck, akCat];        // Прямое присвоение нескольких элементов
  A := A + [akDog];            // Объединение множеств (добавить элемент)
  A := A * [akCat, akDog];     // Пересечение множеств (оставить общие элементы)

  Include(A, akDuck);          // Встроенная функция: добавить один элемент
  Exclude(A, akDuck);          // Встроенная функция: удалить один элемент
end.
Code language: PHP (php)

Описание популярных операций над множествами

  1. [] : Литерал пустого множества
  2. + : Объединение, объединяет две группы элементов
  3. * : Пересечение, сохраняет элементы присутствующие в обоих множествах
  4. Include(Множество, Элемент) : Безопасное добавление элемента
  5. Exclude(Множество, Элемент) : Безопасное удаление элемента

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *