5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

DelphiAdvent Calendar 2020

Day 11

Delphi における Pascal の処理系定義

Last updated at Posted at 2020-12-10

はじめに

標準 Pascal では処理系毎の自由度のために、規格で決まっていない (決められていない) 動作があり、これを処理系定義と呼びます。規格で決まっておらず、処理系毎にも定まっていない動作は処理系依存と呼びます。

Pascal に準拠した言語では、処理系定義をマニュアル等に記載する必要があるのですが、Delphi には記載がないため、これを調べてみようという趣旨の記事となります。

処理系定義

標準 Pascal における処理系定義は次の 13 項目です。

番号 定義
1 文字列用文字の値 6.1.7
2 実数型の値 6.4.2.2
3 文字値の順序数 6.4.2.2
4 ファイル操作手続きの外界に対する効果 6.6.5.2
5 定数名 maxint の値 6.7.2.2
6 実数演算の近似の精度 6.7.2.2
7 Write() のフィールド長パラメータ TotalWidth の基準値 6.9.3.1
8 実数の Write() における ExpDigits の値 6.9.3.4.1
9 実数の Write() における指数表現文字の大文字・小文字の別 6.9.3.4.1
10 論理値の Write() における大文字・小文字の別 6.9.3.5
11 手続き Page() の効果 6.9.5
12 プログラム引数 (ファイル型) の外部実体への結び付け方 6.10
13 Input, Output に Reset(), Rewrite() を適用したときの効果 6.10

章は ISO 8175 / JIS X 3008 のものです。

1. 文字列用文字の値

これは可読文字の事を指しています。Delphi では

  • シングルバイト文字 (ANSI)
  • マルチバイト文字 (ANSI)
  • ワイド文字 (Unicode)

(の可読文字) が使えます。

ソースファイルの文字コードがコード中の文字列用文字コードとして使われる訳ではありません。文字型/文字列型の種類によって使える文字セットは異なります。

See also:

2. 実数型の値

Real 型は リテラルで表せる実数の部分集合 という位置付けになっていますが、Delphi での Real 型は 2.23e-308 .. 1.79e+308 の範囲の値です。

伝統的な Pascal と互換性のある実数型である Real482.94e-39 .. 1.70e+38 の範囲の値です。

伝統的な Pascal で Real 型のデータが書かれたファイルは、

var
  F: File of Real;

Delphi では Real48 を使わないと正しく読み込めない場合があります。

var
  F: File of Real48;

See also:

3. 文字値の順序数

文字の順序値は Ord() 関数で調べることができます。

例えばソースコード中にリテラル文字 'あ' を記述した場合を考えてみましょう。次のコードは Unicode 版 Delphi で 3042 を表示します。これは 'あ' の Unicode でのコードポイントが U+3042 であるからです。

var
  c: Char;
  s: string;
begin
  s := 'あ';
  for c in s do
    Writeln(IntToHex(Ord(c)));
end.

上記コードを ANSI 版 Delphi (日本語環境の Windows) で実行するか、Unicode 版 Delphi で次のコードを実行すると 82,A0 が表示されます。これは 'あ' の Shift_JIS でのコードが 82A0 であるからです。

var
  c: AnsiChar;
  s: AnsiString;
begin
  s := 'あ';
  for c in s do
    Writeln(IntToHex(Ord(c)));
end.

See also:

4. ファイル操作手続きの外界に対する効果

ファイル変数に結び付けられた外部実体に対して行われる実際の処理はドキュメントを参照してください。

手続き 説明
Read() ファイルからデータを読み込む。
Readln() ファイルからテキストを 1 行読み込む。
Reset() ファイル F を先頭に位置付け、
F が空でなければ F の最初の要素が
F^ に代入され、Eof()False を返す。
Rewrite() ファイル F を生成する。
F は空になり、Eof()True を返す。
Write() ファイルにデータを書き込む。
Writeln() ファイルにテキストを 1 行書き出す。

※ Delphi では Get(), Page(), Put() は実装されていません。

5. 定数名 maxint の値

Delphi 1 で 32767 ($7FFF)、それ以外の Delphi で 2147483647 ($7FFFFFFF) です。

See also:

6. 実数演算の近似の精度

内部データ構造のドキュメントを参照してください。

See also:

7. Write() のフィールド長パラメータ TotalWidth の基準値

フィールド長パラメータ (Field Width Parameter) とは Write() 及び Writeln() で指定する書き込みパラメータのうちの省略可能な 2 つのパラメータの事です。

OutExpr [: TotalWidth [: FracDigits ] ]

TotalWidth と FracDigits の事ですね。Delphi では次のように定義されています。

OutExpr [: MinWidth [: DecPlaces ] ]

次のようなコードがあったとすると、

  Writeln(1234);
  Writeln(-1234);

実行結果はこのようになります。

1234
-1234

つまり、TotalWidth (MinWidth) は 1 となります。

8. 実数の Write() における ExpDigits の値

Delphi における浮動小数点の表示フォーマットは次のようになっています。

[ | - ] <digit> . <decimals> E [ + | - ] <exponent>

Writeln(Pi);

の結果が " 3.14159265358979E+0000" となりますので、ExpDigits (exponent) は 4 となります。

ドキュメントには 2 桁の 10 進指数 とありますが、これは誤りだと思われます。

See also:

9. 実数の Write() における指数表現文字の大文字・小文字の別

Delphi での指数表現文字は大文字の E です。

10. 論理値の Write() における大文字・小文字の別

次のコードを実行すると、

  Writeln(True);
  Writeln(False);

このように表示されます。

TRUE
FALSE

Delphi では大文字となります。

11. 手続き Page() の効果

Delphi では手続き Page() は実装されていません。ASCII コードで考えると、次のようなコードになるでしょうか。

procedure Page();
begin
  write(^L); // FF (0x0C)
end;

12. プログラム引数 (ファイル型) の外部実体への結び付け方

関連付けには AssignFile() を使います。関連付けの解除は CloseFile() です。

手続き 説明
AssignFile() 外部ファイルの名前をファイル変数と関連付ける。
Turbo Pascal では Assign()。
CloseFile() ファイル変数と外部ファイル名の関連付けを終了する。
Turbo Pascal では Close()。

See also:

13. Input, Output に Reset(), Rewrite() を適用したときの効果

特に何も起こらないようです。

See also:

おわりに

なんとなくスッキリしましたね。

See also:

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?