<6> 構造化型の概要と配列型 (標準 Pascal 範囲内での Delphi 入門)〔裏〕

# 6. 構造化型の概要と配列型

## 構造化型 (Structured Types)

## 6.1. 配列型 (Arrays)

### (6.1.1.) 静的配列 (Static Arrays)

### (6.1.2.) 動的配列 (Dynamic Arrays)

#### ・動的配列の添字型
Pascal での配列 (静的配列) の添字型は任意の順序型でしたが、動的配列の添字型は Integer で、添字は 0 から始まります。

#### (6.1.2.1.) 配列コンストラクタ (Array Constructor)

#### (6.1.2.2.) 配列定数式 (Array Constant Expression)

### (6.1.3.) 静的配列と動的配列の異なる振る舞い

### (6.1.4.) 配列定数とグローバル配列変数の初期化

#### ・Default() 関数が実装されたのは...

> さらに Delphi 2009 以降には任意の型の「空の値」または「ゼロ値」または「ヌル値」を返すジェネリック型関数 **Default()** があります。

Default() 関数は、正確には **Delphi 2007 for .NET** から存在します。つまりジェネリック型のサポートも **Delphi 2007 for .NET** からです ([参考](http://docs.embarcadero.com/products/rad_studio/radstudio2007/RS2007_helpupdates/HUpdate4/JA/html/devcommon/genericspart_xml.html))。

#### ・Default() 関数がドキュメントに書かれていないのは？

**default** プロパティや **default** 格納指定子があって、さらに `Default()` 関数まであったらややこしくてしょうがないからかもしれませんね。

 - [デフォルトのプロパティ値 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%87%E3%83%95%E3%82%A9%E3%83%AB%E3%83%88%E3%81%AE%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3%E5%80%A4)
 - [格納指定子 (DocWiki)](http://docwiki.embarcadero.com/RADStudio/Sydney/ja/%E3%83%97%E3%83%AD%E3%83%91%E3%83%86%E3%82%A3#.E6.A0.BC.E7.B4.8D.E6.8C.87.E5.AE.9A.E5.AD.90)


### (6.1.5.) 動的配列の割り当て解除

### (6.2.1.) 文字列型の何が特殊なのか

### (6.2.2.) Delphi の文字列型 (String Types)

Delphi 10.3 Rio 以前のモバイルコンパイラでは `$ZEROBASEDSTRINGS` コンパイラ指令が ON になっており、配列のインデックスは 0 から始まります。

### (6.2.3.) Pascal String (パスカル文字列)

> Turbo Pascal や 初代 Delphi の String 型もこのパスカル文字列でした。

Turbo Pascal や Delphi 1 の **String** は Delphi 2 以降では **ShortString** として実装されています。

> 要素 [0] には文字列長が格納されています。文字列は要素 [1] 以降に格納されています。

逆に文字列長を設定する事もできます。

```pascal
var
  s: ShortString;
begin
  s := 'hoge';
  s[0] := Char(20);
  Writeln(Length(s)); // 長さ 20
end;
```

#### ・短い文字列型と ShortString
厳密には短い文字列と **ShortString** は異なります。

短い文字列型は **Turbo Pascal 3.0** までの文字列型です。直接 **String** 型を使う事はできず、必ず型として定義する必要がありました。

```pascal
type
  Str80 = string[80];
var
  s: str80;
  v: string[32];
begin
  s := 'Hello, world.';
  Writeln(s);
end;
```

:::note info
不便な制限ではありますが、**string** が定義なしで 255 文字まで使えたとすると、4 つの文字列変数を使うだけで 1KB 消費する事になります。**Turbo Pascal 3.0** には CP/M-80 版 (Z80) がありましたから、メインメモリが 64KB 以下のシステムで使うにはこういった制限が必要だったのでしょう。
:::

**ShortString** (に相当する文字列型) は **Turbo Pascal 4.0** 以降の文字列型です。直接 **String** 型を使う事ができます。

```pascal
var
  s: string;
begin
  s := 'Hello, world.';
  Writeln(s);
end;
```

内部構造はともかく、これは現在の Delphi と同じ使い方ですね。

#### ・Pascal 文字列 (ShortString) の由来

> 一般的に **Pascal String  (パスカル文字列)** と呼ばれる文字列型は標準 Pascal には存在しません。

この拡張は **UCSD Pascal** 由来のようです。デフォルトで 80 文字 (String)、最大長が 255 文字 (String[255]) でした。

クラシックな MacOS は Pascal / Object Pascal で書かれており、ここでも **Str255** 型という Pascal String が使われており、クラシック MacOS が C / C++ でリライト (?) されても 255 文字制限がずーっと残っていたのだとか。

**See also:**

 - [UCSD Pascal を触るためだけの UCSD p-System 操作ガイド (Qiita)](https://qiita.com/ht_deko/items/50c0cb0fd3cbafc1f8e1)
 - [『Macintosh Programmer’s Workshop Object Pascal 日本語版』を読んでみる (Qiita)](https://qiita.com/ht_deko/items/faefeb7123d04733ec8c)
 - [<3> Macintosh 用 Pascal のオブジェクト指向拡張 (Pascal へのオブジェクト指向拡張の歴史と Delphi) (Qiita)](https://qiita.com/ht_deko/items/cd245180363e1911afa7)


### (6.2.4.) alfa 型

### (6.2.5.) NULL 終端文字列
NULL 終端文字列のサポートは **Turbo Pascal for Windows 1.0** からのようです。

## 6.3. パックとアンパック

## (6.4) 型の互換性 (Compatible Types) と代入の互換性 (Assignment Compatibility)

### (6.4.1) 型の同一性 (Type Identity)

### (6.4.2) 型の互換性 (Compatible Types)

### (6.4.3) 代入の互換性 (Assignment Compatibility)

### (6.4.4) 構造等価 (Structual Equivalence) と 名前等価 (Name Equivalence)
                     

# 索引
[:ramen:](https://qiita.com/ht_deko/items/eedda6d38b6d0887d4ac) [ [← 5. 列挙型と部分範囲型〔裏〕](https://qiita.com/ht_deko/items/e581e8f5c0c32d5a58e2) ] [ [↑ 目次へ](https://qiita.com/ht_deko/items/46fcdbb11cdc58872160) ] [ [→ 7. レコード型〔裏〕](https://qiita.com/ht_deko/items/715620809518de763a67) ]