序數型別做為陣列索引
固定長度陣列 Constant-length arrays
列舉型別、自訂區間序數都可做為陣列索引,彈性自訂陣列的索引範圍。
以下為列舉做陣列索引範例
type
// 1. 一般數值區間索引 0~9
TArrayOfTenStrings = array [0..9] of string;
// 2. 從1開始的索引範圍 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開始的索引範圍 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;
// 宣告TMyNumber型別的迴圈變數I
I: TMyNumber;
// 列舉索引陣列變數
AnimalNameArr: TAnimalNames;
begin
// 1. 0~9索引陣列操作
Arr0To9[0] := '第0個元素'; // 指定值
Arr0To9[5] := '中間元素';
Writeln(Arr0To9[0]); // 讀取值
// 2. 從1起始索引的陣列,不可使用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 lines compiled, 0.2 sec, 68464 bytes code, 4276 bytes data
2 warning(s) issued
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)
集合常用運算子與程序說明
[]:空集合常值+:聯集,合併兩組元素*:交集,取兩組共有的元素Include(集合, 元素):安全新增元素Exclude(集合, 元素):安全移除元素
Previous: 列舉