データ管理

本章では、OpenFrame PL/Iのデータ・タイプ、属性、宣言および使用について説明します。

1. データ・エレメント

本節では、PL/Iプログラムで使用するデータ・タイプとその属性について説明します。

1.1. データ項目

データ項目は、変数または定数の値です。データ項目は、スカラーと呼ばれる単一の項目です。あるいは、データ集合体と呼ばれるデータ項目の集まりであることもあります。

データ集合体の種類には、配列と構造体があります。

  • 変数

    変数は値を持ちます。この値はプログラムの実行中に変化することがあります。変数は名前と属性を宣言して使用することができます。

    変数参照は、以下のいずれかになります。

    • 宣言されている変数名

    • 以下の1つ以上から派生した参照

      • ポインター修飾(Pointer qualification)

      • 構造体修飾(Structure qualification)

      • 添え字付け(Subscripting)

    以下は、変数を参照する例です。

      DCL X(3) CHAR(10);
      DCL 1 A,
            3 B CHAR(10);
      DCL Y(3) CHAR(10) BASED(P);
      DCL P PTR;
    
      X(1) = 'TEST';      /* subscripting - X(1) */
      A.B = 'MEMBER';     /* 構造体修飾を使用して参照 - A.B*/
      P = ADDR( X );      /* 変数名を参照 - P, X */
      DISPLAY( P->Y(1) )  /* ->記号を使ったポインター修飾と添え字付けを一緒に使用して参照 - P->Y(1) */
  • 定数

    定数は、プログラムの実行中に値が変化しません。

  • 句読点のついた定数

    読みやすくするために、数字、ビット、16進数の定数にはアンダーバー(_)を使用することができます。

      43_345_842    ==>  45345842
      1100_0011B    ==>  11000011B
      '1001_0011'B  ==> '10010011'B
      'C_A'B4       ==> 'CA'B4

1.2. データ・タイプと属性

PL/Iプログラムで使用されるデータには、計算データとプログラム制御データがあります。

  • 計算データ

    • 演算に使用され、結果が得られる値です。算術データと文字列データから構成されます。

    • 算術データには、コード化算術データと数値ピクチャー・データがあります。

    • コード化算術データの項目は、数を値として使用します。それは、基数(BINARYまたはDECIMAL)、スケール(FLOATまたはFIXED)、精度の属性を持ちます。

    • 数値ピクチャー・データは、文字形式で保存されます。詳細については、ピクチャー指定を参照してください。

  • プログラム制御データ

    • プログラムの実行を制御する値です。

    • エリア、エントリ、ラベル、形式、ポインター、オフセットのようなデータ・タイプで構成されます。

以下の例において、VAR1、VAR2は計算データのコード化算術変数です。数字2と3.14は、算術定数になります。

VAR1 = (VAR2**2) * 3.14

プログラム制御データの定数は、コンパイラーによって決まります。

以下の例において、LAB1はプログラム制御データのラベル定数です。LAB1の値は、「statement X = Y + 3;」のアドレスです。

LAB1: X = Y + 3;
      A = B || C;

データ項目を使用するために、PL/Iはデータ・タイプと動作方法を把握する必要があります。属性がこのような情報を提供します。

属性の種類には、データ属性と非データ属性があります。

  • データ属性

    以下は、計算データおよびプログラム制御データの特性を持つ属性です。

    AREA      BINARY    BIT         CHARACTER   DECIMAL   DIMENSION   ENTRY
    FILE      FIXED     FLOAT       FORMAT      GRAPHIC   LABEL       NONVARYING
    PICTURE   POINTER   PRECISION   RETURNS     SIGNED    STRUCTURE   UNSIGNED
    VARYING
    • CHARACTERは、計算データの文字列タイプを指定するためのデータ属性です。

    • FILEは、プログラム制御データのファイル・タイプを指定するためのデータ属性です。

  • 非データ属性

    以下は、非データ・エレメント(たとえば、組み込み関数)の属性または他のデータ属性の追加的な属性です。

    ALIGNED     AUTOMATIC    BASED       BUILTIN    BYADDR    BYVALUE      CONDITION
    CONTROLLED  DEFIEND      DIRECT      EXTERNAL   GENERIC   INITIAL      INTERNAL
    LIKE        LIST         PARAMETER   POSITION   RECORD    SEQUENTIAL   STATIC
    STEAM       UNALIGNED    VARIABLE
    • INTERNALという有効範囲属性は、データ項目が宣言されたブロックでのみ使用できます。

1.3. 計算データ・タイプと属性

本節では、計算データのタイプを分類し、関連づけられている属性について説明します。

1.3.1. コード化算術データと属性

コード化算術の文法は以下のとおりです。

figure syntax coded arithmetic
属性 略語

BINARY

BIN

DECIMAL

DEC

PRECISION

PREC

  • BINARYとDECIMAL属性

    • コード化算術データの基数が10進数または2進数のいずれかであることを指定します。

    • DECIMALはデフォルトです。

  • FIXEDとFLOAT属性

    • コード化算術データの小数点が固定小数点なのか、浮動小数点なのかを指定します。

  • PRECISION属性

    • コード化算術データの桁数と位取り係数を指定します(位取り係数は、固定小数点データ項目にのみ指定します)。

    • 桁数は、データ項目の値を何桁まで持つことができるかを整数で指定します。

    • 固定小数点データ項目は、数値の2進数または10進数の桁数全体を記述します。

    • 浮動小数点データ項目は、仮数(mantissa)部分の桁数を指定します。

    • 位取り係数は、少数点部分の桁数を記述します。

  • SIGNEDとUNSIGNED属性

    • FIXED BINARY変数にのみ適用できます。

    • SIGNED属性が記述されると、変数が負の値になることがあります。UNSIGNEDは、変数が正の値のみを持つことができます。SIGNED、UNSIGNED属性は、ストレージのサイズにも影響を与えます。

      項目 精度 ストレージ・サイズ

      FIXED BINARY SIGNED
      データ・ストレージ・サイズ

      p <= 7

      1

      7 < p <= 15

      2

      15 < p <= 31

      4

      31 < p <= 63

      8

      FIXED BINARY UNSIGNED
      データ・ストレージ・サイズ

      p <= 8

      1

      8 < p <= 16

      2

      16 < p <= 32

      4

      32 < p <= 64

      8

  • 2進固定小数点データ

    • 以下に例を見ると、変数VAR1は、20ビットの2進固定小数点データ項目です。右側の2ビットは2進小数点を表記するために使われます。

      DECLARE VAR1 FIXED BINARY (20,2);

      上記の場合、20ビットは低位桁に入ります。そのため、余分な高位の桁位置が存在することになり、これらは演算時に使用されることがあります。この余分な高位桁位置にオーバーフローが発生した場合、SIZE条件が使用可能な状態のときにSIZE条件が起こります。

  • 2進固定小数点定数

    • 0と1で構成された2進定数にBが最後に付きます。この定数はその値に応じて精度(p,q)を持ちます。

    • 以下に例を示します。

      定数 精度

      1011_0B

      (5,0)

      1011_111B

      (7,0)

      1001.010B

      (7,3)

  • XN(16進数)2進固定小数点定数

    • XN定数はSIGNED REAL FIXED BINARYデータ属性を持つ16進数の数字から成る定数です。

    • 最後にXNを記述します。各16進数は4ビットを表します。

    • 定数が8以下の数字の場合は精度31を持ち、それ以上は精度63を持ちます。

    • 文法は以下のとおりです。

      figure syntax xn constant
    • '100’XNは256と同じです。

  • XU(16進数)2進固定小数点定数

    • XU定数はUNSIGNED REAL FIXED BINARYデータ属性を持つ16進数の数字から成る定数です。

    • 最後にXUを記述します。各16進数は4ビットを表します。

    • 定数が8以下の数字の場合は精度31を持ち、それ以上は精度63を持ちます。

    • 文法は以下のとおりです。

      figure syntax xu constant
    • '8000’XUは32,768と同じです。

  • 10進固定小数点データ

    • 以下は設定例です。

      DECLARE VAR1 FIXED DECIMAL (7,3);

      変数VAR1は、7桁の10進固定小数点データ項目です。3桁は小数点の右側にできます。10進固定小数点データは、パック10進数形式で保存されます。すなわち、1バイトに2桁ずつ保管され、最右端バイトの右4ビットに符号が保管されます。

  • 10進固定小数点定数

    • 小数点が存在できる10進(数字0~9)の数字で構成された定数です。この定数はその値に応じて精度(p,q)を持ちます。

    • 以下に例を示します。

      定数 精度

      43.436

      (5,3)

      12.453154

      (8,6)

      0043

      (4,0)

  • 2進浮動小数点データ

    • 以下は設定例です。

      DECLARE VAR1 BINARY FLOAT (16);

      変数VAR1は、16進数を有効数字として持つ2進浮動小数点データ項目です。精度が21以下であれば、4バイトのストレージ・サイズを持つfloat型の項目であり、53以下の場合は、ストレージ・サイズが8バイトのdouble型のデータ項目となります。それ以上の精度はサポートしません。

  • 2進浮動小数点定数

    • 仮数、指数で構成された定数の後ろにBが付きます。指数は、E、S、Dを持つことができます。SとDは、それぞれfloat型、double型のデータ項目に対する精度の最大値を精度として使用します。

      定数 精度

      1101011E+4B

      (7)

      1101.011E-6B

      (7)

      101.0E-12

      (4)

      1S0B

      (21)

      1D0B

      (53)

  • 10進浮動小数点データ

    • 以下は設定例です。

      DECLARE VAR1 DECIMAL FLOAT (5);

      変数VAR1は、有効数字5桁の10進浮動小数点データ項目です。精度が6以下であれば、4バイトのストレージ・サイズを持つfloat型のデータ項目であり、16以下の場合はストレージ・サイズが8バイトのdouble型のデータ項目になります。それ以上の精度はサポートしません。

  • 10進浮動小数点定数

    • 仮数、指数で構成された定数です。指数は E、S、Dを持つことがでいます。SとDは、それぞれfloat型、double型のデータ項目に対する精度の最大値を精度として使用します。

      定数 精度

      435E-1

      (3)

      435E+1

      (3)

      3.235E-4

      (4)

      1S0

      (6)

      1D0

      (16)

1.3.2. 文字列データと属性

様々な種類の文字列データ・タイプとその属性について説明します。

  • BIT属性、CHARACTER属性、GRAPHIC属性、WIDECHAR属性

    • BIT属性は、ビット文字列を指定します。

    • CHARACTER属性は、CHARACTER文字列を指定します。PICTURE属性を使用して宣言することができます。

    • GRAPHIC属性は、DBCS(Double-byte Character Set)文字列を指定します。

    • WIDECHAR属性は、UTF-16文字列を指定します。

    • 文法は以下のとおりです。

      figure syntax string attribute
      属性 略語

      CHARACTER

      CHAR

      GRAPHIC

      G

      WIDECHAR

      WCHAR

      NONVARYING

      NONVAR

      VARYING

      VAR

    • 文字列の長さはlength位置に指定します。VARYING属性がある場合は、可変長の文字列になりますが、そのとき、length位置に指定した長さは最大値となります。

    • パラメータの場合、文字列の長さをアスタリスク(*)で指定できます。そのとき、実際の長さは引数から求めます。

    • REFERの詳細については、REFER属性を参照してください。

  • VARYING属性とNONVARYING属性

    • NONVARYING属性は、文字列の長さが宣言されるときの長さを常に持ちます。

    • VARYING属性を持っていれば、文字列は可変長です。VARYING属性を持つ場合、ストレージ・サイズは宣言された長さより2バイト大きいです。最左端の2バイトは、文字列の現在長が入ります。

  • PICTURE属性(略語: PIC)

    • データ項目の各位置に該当するピクチャー文字に基づいてデータが保存されます。

    • 以下図のpicture-specificationについては、 ピクチャー指定で詳しく説明します。

      figure syntax picture attribute
    • 数字データの保存は文字列形式になっていますが、当該データは算術値を持ちます。算術演算が行われる前にコード化算術データに変換されます。

  • 文字データ

    • 1バイトの文字を保存するデータ項目です。

    • ASCIIコードを文字コードとして使用します。

  • 文字定数

    • 文字定数は、単一引用符(' ')または二重引用符(" ")で囲んだ文字列です。

    • 文法は以下のとおりです。

      figure syntax char constant
    • 'Conan Doyle''s "Sherlock Holmes"'の文字定数の内容は31文字で構成された文字列です。

      Conan Doyle’s "Sherlock Holmes"には、単一引用符が区切り文字として文字列を囲んでいます。Doyleの後ろにある連続した単一引用符は区切り文字ではなく、文字列として単一引用符が使用されていることを示します。したがって、実際の文字列の内容は、Doyle''s ⇒ Doyle’sになります。

      単一引用符が区切り文字として使用されたため、二重引用符は文字列として処理されます。

    • 定数に反復因数を使用することができます。(2)'TEST’は’TESTTEST’と同じです。

  • X(16進数)文字定数

    • X文字定数は、偶数の16進数から成る文字列です。

    • 単一引用符(' ')または二重引用符(" ")で囲まれており、各ペアは1つの文字列を示します。最後に文字Xで終了されます。

      figure syntax x constant
    • 'od0A’Xの長さは2です。

  • ビット・データ

    • BIT属性を持つデータは、ビット文字列を処理することができます。

  • ビット定数

    • 0と1の2進数で構成された連続的な文字列です。

    • 単一引用符(' ')または二重引用符(" ")で囲まれており、最後にBが付きます。

    • 文法は以下のとおりです。

      figure syntax bit constant
    • '1101’Bはビット定数として、1101Bとは異なります。後者はコード化算術データです。

  • B4(16進数)ビット定数

    • B4ビット定数は、単一引用符(' ')または二重引用符(" ")で囲まれた16進数で構成された文字列です。

    • 最後にB4を記述します。各16進数は4ビットを表します。BXはB4の同義語です。

    • 文法は以下のとおりです。

      figure syntax b4 constant
    • 'CA’B4は、'11001010’Bと同じです。

  • B3(8進数)ビット定数

    • B3ビット定数は、単一引用符(' ')または二重引用符(" ")で囲まれた8進数で構成された文字列です。

    • 最後にB3を記述します。各8進数は3ビットを表します。

    • 文法は以下のとおりです。

      figure syntax b3 constant
    • '22’B3は'010010’Bと同じです。

  • グラフィック・データ

    • グラフィック・データは、DBCS文字を含むことができます。

    • 1つのDBCS文字は、2バイトを使用します。

  • グラフィック定数

    • 単一引用符(' ')または二重引用符(" ")で囲まれたDBCS文字列です。

    • 最後にGを記述します。単一引用符、二重引用符またはG文字は、DBCS文字を使用することができます。

  • GX(16進数)グラフィック定数

    • GXグラフィック定数は、単一引用符(' ')または二重引用符(" ")で囲まれた16進数で構成された文字列です。

    • 最後にGXを記述します。各4桁の16進数は1つのDBCS文字を表します。

    • 文法は以下のとおりです。

      figure syntax gx constant
  • ワイド文字データ

    • ワイド文字データは、UTF-16文字を含むことができます。

    • 1つのUTF-16文字は、2バイトを使用します。

  • WX(16進)ワイド文字定数

    • WX(16進)ワイド文字定数、単一引用符(' ')または二重引用符(" ")で囲まれた16進数で構成された文字列です。

    • 最後にWXを記述します。各4桁の16進数は、1つのUTF-16文字を表します。

    • 文法は以下のとおりです。

      figure syntax wx constant

1.3.3. ピクチャー指定

ピクチャー指定は、単一引用符(' ')または二重引用符(" ")で囲まれたピクチャー文字で構成されます。ピクチャー文字は、その文字の位置に該当するデータ内容が含まれています。

ピクチャー指定は、データ項目が文字データ項目なのか、数字データ項目なのかを指定します。AまたはXのピクチャー文字があると文字ピクチャー指定となり、それ以外の場合は、数字ピクチャー指定です。

  • ピクチャー反復因数

    • ピクチャー文字の前に繰り返し回数を括弧内に入れることができます。

    • たとえば、PIC '(4)9V(2)9’は、PIC '9999V99’と同じです。

  • 文字データ用のピクチャー文字

    • 文字データを表現するためのピクチャー文字にはX、A、9があります。

      ピクチャー文字 意味

      X

      1バイトのすべての文字が使用可能です

      A

      英字と#、@、$ および空白文字が使用可能です

      9

      数字または空白文字が使用可能です

    • 以下は、ピクチャー文字を使用する例です。

       DCL PIC_DATA PICTURE 'AAA99X';

      上記のような宣言がある場合、以下の値はPIC_DATAの値として有効です。bは空白です。

      'ABC12M'
      'bbb09/'
      'XYZb13'

      以下の値は無効です。

      'AB123M'  ==> 3番目文字の「1」がピクチャー文字Aに該当する位置なので正しくありません。
      'ABC1/2'  ==> 5番目文字の「/」がピクチャー文字9に該当する位置なので正しくありません。
      'Mb#A5;’ ==> 4番目文字の「A」がピクチャー文字9に該当する位置なので正しくありません。
  • 数字データ用のピクチャー文字

    • 数字データは算術値を表します。ピクチャー指定にはX、Aを含むことができません。

    • 数字データは、その使用方法に応じて、算術値または文字値のいずれかに処理されます。

      区分 説明

      算術値

      ピクチャー項目の算術値は、以下の場合に使用されます。

      • 変数がコード化算術値またはビット値を求める式で使用された場合

      • 変数がコード化算術変数、数字変数またはビット変数に割り当てられる場合

      • 編集ディレクティブI/Oにおいて、C、E、F、B、P(数字)形式として使用される場合

      数字変数の算術値が内部的にコード化算術値に変換されます。

      文字値

      ピクチャー・データ項目の文字値は、以下の場合に使用されます。

      • 変数が文字式に使用されている場合

      • 文字変数に指定される場合

      • リスト・ディレクティブまたはデータ・ディレクティブに出力される場合

      • 編集ディレクティブ出力にAまたはP(文字)形式で出力される場合

  • 数字と小数点

    • ピクチャー文字9とVは、固定小数点10値数値を表すときに使用します。

      ピクチャー文字 説明

      9

      関連するデータ項目の位置に10進数が入ることを指定します。

      V

      小数点の位置を指定します。データのストレージは取りません。

    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(5)

      12345

      99999

      12345

      FIXED(5)

      12345

      99999V

      12345

      FIXED(5)

      12345

      999V99

      undefined(SIZE条件が起こる)

      FIXED(5)

      12345

      V99999

      undefined(SIZE条件が起こる)

      FIXED(7)

      1234567

      99999

      undefined(SIZE条件が起こる)

      FIXED(3)

      123

      99999

      00123

      FIXED(5,2)

      123.45

      999V99

      12345

      FIXED(7,2)

      123.45.67

      9V9

      undefined(SIZE条件が起こる)

      FIXED(5.2)

      123.45

      99999

      00123

  • ゼロ消去

    • ピクチャー文字Zとアスタリスク(*)は、先行ゼロを空白またはアスタリスク(*)で処理します。

      先行ゼロとは、データ項目が持っている数値の左端の数字桁です。先行ゼロでない場合、位置に該当する数字が保存されます。

      ピクチャー文字 説明

      Z

      先行ゼロを空白に置き換えます。

      *

      先行ゼロをアスタリスク(*)に置き換えます。

    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(5)

      12345

      ZZZ99

      12345

      FIXED(5)

      00100

      ZZZ99

      bb100

      FIXED(5)

      00100

      ZZZZZ

      bb100

      FIXED(5)

      00000

      ZZZZZ

      bbbbb

      FIXED(5,2)

      123.45

      ZZZ99

      bb123

      FIXED(5,2)

      001.23

      ZZZV99

      bb123

      FIXED(5)

      12345

      ZZZV99

      undefined(SIZE条件が起こる)

      FIXED(5)

      000.08

      ZZZVZZ

      bbb08

      FIXED(5.2)

      000.00

      ZZZVZZ

      bbbbb

      FIXED(5)

      00100

      *****

      **100

      FIXED(5)

      00000

      *****

      *****

      FIXED(5.2)

      000.01

      ***V**

      ***01

      FIXED(5.2)

      95

      $**9.99

      $**0.95

      FIXED(5.2)

      12350

      $**9.99

      $123.50

  • 挿入文字

    • ピクチャー文字のコンマ(,)、小数点(.)、スラッシュ(/)、Bを指定すると、対応する位置にその文字が挿入されます。

      項目 説明

      コンマ(,)、小数点(.)、スラッシュ(/)

      ゼロ消去が発生しなければ、ピクチャー文字に該当する文字を挿入します。

      ゼロ消去が発生した場合は、以下の場合にのみ文字挿入が行われます。

      • 先行ゼロではない数字桁がピクチャー文字の左側にある場合

      • ピクチャー文字のVが左側にあり、小数部分の桁が0でない場合

      • ピクチャー文字が先頭に位置する場合

      以外の場合には、その前にある文字と等しくゼロ抑制文字として処理されます。

      B

      ピクチャー文字の位置に空白を挿入します。

    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(4)

      1234

      9,999

      1,234

      FIXED(6,2)

      1234.56

      9,999V.99

      1,234.56

      FIXED(4,2)

      12.34

      ZZ.VZZ

      12.34

      FIXED(4,2)

      00.03

      ZZ.VZZ

      bbb03

      FIXED(4,2)

      00.03

      ZZV.ZZ

      bb.03

      FIXED(4,2)

      12.34

      ZZ.VZZ

      12.34

      FIXED(4,2)

      00.00

      ZZZV.ZZ

      bbbbb

      FIXED(9.2)

      1234567.89

      9,999,999V.99

      1,234,567.89

      FIXED(7.2)

      12345.67

      **,999V.99

      12.345.67

      FIXED(7,2)

      00123.45

      **,999V.99

      ***123.45

      FIXED(9.2)

      1234567.89

      9.999.999V,99

      1.234.567,89

      FIXED(6)

      123456

      99/99/99

      12/34/56

      FIXED(6)

      123456

      99.9/99.9

      12.3/45.6

      FIXED(6)

      001234

      ZZ/ZZ/ZZ

      bbb12/34

      FIXED(6)

      000012

      ZZ/ZZ/ZZ

      bbbbbb12

      FIXED(6)

      000000

      ZZ/ZZ/ZZ

      bbbbbbbb

      FIXED(6)

      000000

      **/**/**

      ********

      FIXED(6)

      000000

      **B**B**

      **b**b**

      FIXED(6)

      123456

      99B99B99

      12b34b56

      FIXED(3)

      123

      9BB9BB9

      1bb2bb3

      FIXED(2)

      12

      9BB/9BB

      1bb/2bb

  • 符号と通貨記号

    • ピクチャー文字S、+、-は、符号を指定します。

      ピクチャー文字 説明

      $、\

      通貨記号を表示します。先行ゼロの場合はゼロ消去が行われます。

      S

      データ項目の算術値がゼロ以上の場合は+、ゼロより小さい場合は-を指定します。先行ゼロの場合はゼロ消去が行われます。

      +

      データ項目の算術値がゼロ以上の場合は+、ゼロより小さい場合は空白を指定します。先行ゼロの場合はゼロ消去が行われます。

      -

      データ項目の算術値がゼロ以上の場合は空白、ゼロより小さい場合は-を指定します。先行ゼロの場合はゼロ消去が行われます。

    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(5,2)

      123.45

      $999V.99

      $123.45

      FIXED(5,2)

      012.00

      99$

      12$

      FIXED(5,2)

      001.23

      $ZZZV.99

      $bb1.23

      FIXED(5,2)

      000.00

      $ZZZV.ZZ

      bbbbbbb

      FIXED(1)

      0

      $$$.$$

      bbbbbb

      FIXED(5,2)

      123.45

      $$$9V.99

      $123.45

      FIXED(5,2)

      001.23

      $$$9V.99

      bb$1.23

      FIXED(2)

      12

      $$$,999

      bbb$012

      FIXED(4)

      1234

      $$$,999

      b$1,234

      FIXED(5,2)

      2.45

      SZZZV.99

      +bb2.45

      FIXED(5)

      214

      SS,SS9

      bb+214

      FIXED(5)

      -4

      SS,SS9

      bbbb-4

      FIXED(5.2)

      -123.45

      +999V.99

      b123.45

      FIXED(5.2)

      -123.45

      -999V.99

      -123.45

      FIXED(5.2)

      123.45

      999V.99S

      123.45+

      FIXED(5.2)

      001.23

      ++B+9V.99

      bbb+1.23

      FIXED(5.2)

      001.23

      ---9V.99

      bbb1.23

      FIXED(5.2)

      -001.23

      SSS9V.99

      bb-1.23

  • オーバーパンチ文字

    • ピクチャー文字T、I、Rは、負の値・正の値に応じて0~9を別の文字に置き換えます。

    • 置き換えられる文字は以下のように定義されます。

      figure overpunch table
    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(4,2)

      21.05

      ZZV9T

      210E

      FIXED(3,2)

      -0.07

      ZZV9T

      bb0P

      FIXED(4,2)

      21.05

      ZZV9I

      210E

      FIXED(3,2)

      -0.07

      ZZV9I

      bb07

      FIXED(3)

      132

      R99

      132

      FIXED(3)

      -132

      R99

      J32

      FIXED(5,2)

      001.23

      $ZZZV.99

      $ 1.23

  • ゼロ置き換え

    • ピクチャー文字Yは、その位置にある0を無条件に空白で置き換えます。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FIXED(5)

      00100

      YYYYY

      bb1bb

      FIXED(5)

      10203

      9Y9Y9

      1b2b3

      FIXED(5,2)

      000.04

      YYYVY9

      bbbb4

  • 指数文字

    • ピクチャー文字K、Eは、浮動小数点を表すための指数文字です。

      ピクチャー文字 説明

      K

      該当する位置の右側が指数部分であることを指定します。

      この文字は情報のみ表示しており、データのストレージは取りません。

      E

      該当する位置に指数部分の始まりを示す文字Eが入ることを指定します。

      この文字はストレージを取ります。

    • 以下に例を示します。

      ソース属性 ソース・データ ピクチャー指定 文字値

      FLOAT(5)

      0.12345E06

      V.99999E99

      .12345E06

      FLOAT(5)

      0.12345E-06

      V.99999ES99

      .12345E-06

      FLOAT(5)

      0.12345E+06

      V.99999KS99

      .12345+06

      FLOAT(5)

      -123.45E+12

      S999V.99ES99

      -123.45E+12

      FLOAT(5)

      001.23E-01

      SSS9.V99ESS9

      123.00Eb-3

      FLOAT(5)

      001.23E+04

      ZZZV.99KS99

      123.00E+02

      FLOAT(5)

      001.23E+04

      SZ99V.99ES99

      +123.00E+02

      FLOAT(5)

      001.23E+04

      SSSSV.99E-99

      +123.00Eb02

2. データ変換

本節では、計算データの変換について説明します。

PL/Iは、特定の属性を持つ1つのデータ項目が、別の属性を持つデータ項目に保存されるときにデータを変換します。計算データ値の変換は、数学的な数値を表現するための精度、または文字列を表現するための長さ情報の属性値を変換することができます。

以下は、データ変換が行われる場合についての説明です。

事例 ターゲットの属性

割り当て

割り当てのターゲットとなる変数の属性です。

式のオペランド

式を計算する規則によって決まります。

ストリームの入力(GETステートメント)

受け入れフィールドの属性です。

ストリームの出力(PUTステートメント)

編集ディレクティブ・ストリームの場合は、指定された形式によって決まります。それ以外の場合には文字列に変換します。

PROCEDUREまたはENTRYへの引数

対応するパラメータの属性です。

組み込み関数または疑似変数への引数

組み込み関数または疑似変数の種類によって決まります。

RETURNステートメントの式

PROCEDUREに記述されたRETURNS属性です。

文字列の長さを除いたソースとターゲット・データ項目のすべての属性は、コンパイル時に決める必要があります。変換には特別な処理が必要です。

以下は、変換例です。

    DCL A FIXED DEC(3,2) INIT(1.23);
    DCL B FIXED BIN(15,5);
    B = A

1.23のDECIMAL表記(10進数)がBINARY(11,7)表記の1.0011101Bに変換されます。次に、精度の変換が行われて、結果がBINARY(15,5)の1.00111Bになります。

2.1. 文字列の長さの変換

ソース文字列は、ターゲット文字列の左から右へ保存されます。ソース文字列の長さがターゲット文字列の長さより長いときは超過する部分は無視され、STRINGSIZE条件が起こります。

保存されるターゲット文字列が固定長で、ソース文字列よりも長いときは、不足部分の分だけ以下の文字で埋め込まれます。

  • CHARACTER文字列のときは空白文字

  • BIT文字列のときは'0’B文字

  • GRAPHIC文字列のときはDBCS空白文字

2.2. 精度の変換

ソースの算術値がターゲットの精度を除いた他の属性と同じであれば、精度の変換が必要になります。固定小数点データは、常に位置合わせされて精度が変換されます。したがって、左側または右側で必要な桁の分だけ埋め込みや切り捨てが行われることがあります。浮動小数点データの場合は、ゼロが埋め込まれたり、削除されたりします。

2.3. その他のデータ属性の変換

以下のデータ属性を持つデータ項目には、ソースからターゲットへの変換規則が存在します。詳細については、ソースからターゲットへの変換規則を参照してください。

  • コード化算術

    • FIXED BINARY

    • FIXED DECIMAL

    • FLOAT BINARY

    • FLOAT DECIMAL

  • 算術文字PICTURE

  • CHARACTER

  • BIT

  • GRAPHIC

10進数表記と2進数表記に応じて値が変わることがあります。10進数表記と2進数表記は、3.32という値によって変換が行われます。

  • n桁の10進数は、CEIL( n * 3.32)桁の2進数に変換されます。

  • n桁の2進数は、CEIL( n / 3.32 )桁の10進数に変換されます。

2.4. ソースからターゲットへの変換規則

本節では、タイプ別に変換がどのように行われるのかについて説明します。

2.4.1. ターゲット: コード化算術

  • ソース: FIXED BINARY、FIXED DECIMAL、FLOAT BINARY、FLOAT DECIMAL

    • タイプ別に以下で記述します。

  • ソース: 算術文字PICTURE

    • データは、まずPICTURE.attributeに記述された内容に従ってスケールと精度が決まります。これに相当するFIXED DECIMALまたはFLOAT DECIMAL値に変換されます。この10進値はターゲットの属性に従って変換されます。

  • ソース : CHARACTER

    • CHARACTER文字列は、有効な算術定数である必要があります。定数は符号で始まることも可能です。符号と定数の間には空白があってはなりません。

    • 定数は、基数、スケール、モード、精度を持ちます。値を割り当てる際のこの属性はターゲットの属性に合わせて変換されます。

    • 演算式の計算で中間結果が必要な場合は、(N, 0)の精度を持つ10進固定小数点値が使われます。文字列の小数点以下は切り捨てられます。

  • ソース : BIT

    • 演算式の計算中に変換が発生すると、ビット文字列は符号なしFIXED BINARY(M,0)に変換されます。その後、ターゲットの属性に合わせて変換されます。

    • ビット文字列の長さが精度の最大値を取得する場合、左側のビットは無視されます。そのとき、ゼロ以外のバットが無視されると、SIZE条件が起こります。

  • ソース : GRAPHIC

    • GRAPHIC文字列は、まずCHARACTERに変換されます。その後、CHARACTER変換規則に従って変換されます。

2.4.2. ターゲット: FIXED BINARY(p2, q2)

  • ソース: FIXED DECIMAL(p1, q1)

    • 以下は、結果精度です。

      p2 = min(M, 1+ CEIL(p1 * 3.32)) ,
      q2 = CEIL(ABS(q1 * 3.32)) * SIGN(q1)
  • ソース: FLOAT BINARY(p1)

    • 以下は、結果精度です。

      p2 = p1

      q2は、実際の小数点の位置が計算されて決まります。

  • ソース: FLOAT DECIMAL(p1)

    • 結果精度は、FIXED DECIMALからFIXED BINARYへの変換式と同じ式を使用します。

    • p1は宣言されている値を持ち、q1は実際の小数点の位置が計算されて決まります。

  • ソース : 算術文字PICTURE

  • ソース : CHARACTER

  • ソース : BIT

  • ソース : GRAPHIC

2.4.3. ターゲット: FIXED DECIMAL(p2, q2)

  • ソース : FIXED BINARY(p1, q1)

    • 以下は、結果精度です。

      p2 = 1 + CEIL(p1 / 3.32),
      q2 = CEIL(ABS(q1 / 3.32)) * SIGN(q1)
  • ソース : FLOAT BINARY(p1)

    • 以下は、結果精度です。

      p2 = p1

      p1は宣言された値であり、q1は実際の小数点の位置です。

  • ソース : FLOAT DECIMAL (p1)

    • 以下は、結果精度です。

      p2 = p1

      q2は、実際の小数点の位置が計算されて決まります。

  • ソース : 算術文字PICTURE

  • ソース : CHARACTER

  • ソース : BIT

  • ソース : GRAPHIC

2.4.4. ターゲット: FLOAT BINARY(p2)

2.4.5. ターゲット: FLOAT DECIMAL(p2)

  • ソース : FIXED BINARY(p1, q1)

    • 以下は、結果精度です。

      p2 = CEIL( p1 / 3.32 )
  • ソース : FIXED DECIMAL(p1, q1)

    • 以下は、結果精度です。

      p2 = p1
  • ソース : FLOAT BINARY(p1)

    • 以下は、結果精度です。

      p2 = CEIL(p1 / 3.32)
  • ソース : 算術文字PICTURE

  • ソース : CHARACTER

  • ソース : BIT

  • ソース : GRAPHIC

2.4.6. ターゲット: 算術文字PICTURE

算術文字PICTUREデータ項目は、10進固定小数点または10進浮動小数点の値を文字表記で表したものです。

以下は、ソースが算術文字PICTUREデータ項目に変換されるとき、左端または右端の値を失わずに変換する規則について説明します。

  • ソース : FIXED BINARY(p1, q1)

    • ターゲットが以下の条件を満たしている必要があります。

      fixed decimal(1 + x + q - y, q)
      または
      float decimal(x)

      ただし、x >= CEIL(p1 / 3.32)、y = CEIL(q1 /3.32)、q >= yであること。

  • ソース : FIXED DECIMAL( p1, q1 )

    • ターゲットが以下の条件を満たしている必要があります。

      fixed decimal(x + q - q1, q)
      または
      float decimal(x)

      ただし、x >= p1、q >= q1であること。

  • ソース : FLOAT BINARY(p1)

    • ターゲットが以下の条件を満たしている必要があります。

      fixed decimal(p, q)
      または
      float decimal(p)

      ただし、p >= CEIL(p1 / 3.32)であること。

  • ソース : FLOAT DECIMAL(p1)

    • ターゲットが以下の条件を満たしている必要があります。

      fixed decimal(p, q)
      または
      float decimal(p)

      ただし、p >= p1であること。

  • ソース : CHARACTER

  • ソース : BIT(n)

    • ターゲットが以下の条件を満たしている必要があります。

      fixed decimal(1 + x + q, q)
      または
      float decimal(x)

      ただし、x >= CEIL(n / 3.32)、q >= 0であること。

  • ソース : GRAPHIC

2.4.7. ターゲット: CHARACTER

  • ソース : FIXED BINARY(p1, q1)

    • まず、変換規則に従ってFIXED DECIMALに変換されます。次に、同じ変換規則でFIXED DECIMALからCHARACTERに変換されます。

  • ソース : FIXED DECIMAL(p1, q1 )

    • 文字列定数に変換されます。

    • p1 >= q1 >= 0の場合、長さp1 + 3(負符号(-)、小数点、小数点の先行ゼロを入れる場合に備えて、3を用意しておきます)で右寄せされます。

      • 先行ゼロは空白に置き換えられます。ただし、定数部分のゼロの場合、小数点のすぐ前のゼロは除外します。

      • 負数の場合、最初の桁の前に負符号(-)が付けられます。正の値には符号は付けられません。

      • q1 = 0の場合、小数点は入りません。

    • p1 < q1またはq1 < 0の場合は、位取り係数が右端に付けられます。

      位取り係数の文法は以下のとおりです。

      F{+|-}nn

      {+|-}nnは-q1の値です。文字列定数の長さは、p1+k+3になります。kは位取り係数のFと「+」、「-」符号を除いた長さです。

    • 以下は、変換例です。

      精度 文字列

      ( 6, 0 )

      4352

      'bbbbb4352'

      ( 3, 1 )

      -43.2

      'b-43.2'

      ( 4, -3 )

      -4352000

      '-4352F+3'

  • ソース : FLOAT BINARY(p1)

    • まず、変換規則に従ってFLOAT DECIMALに変換されます。次に、同じ変換規則でFLOAT DECIMALからCHARACTERに変換されます。

  • ソース : FLOAT DECIMAL(p1)

    • 10進浮動小数点ソースは、E形式項目によって変換されます。

    • 文字列の長さはp1 + 8であり、小数点以下の桁数はp1 - 1、有効桁数はp1です。

    • 以下は、変換例です。

      精度 文字列

      ( 6)

      4384*10**5

      'b4.38400E+0008'

      ( 6 )

      -.005832

      '-5.83200E-0003'

      ( 4 )

      1

      'b1.000E+0000'

  • ソース : 算術文字PICTURE

    • 算術文字PICTUREデータ項目は、算術値を文字列形式で保存するため、保存された文字列データがそのままCHARACTER文字列になります。

    • 文字データで値が割り当てられる場合、文字列長の変換規則に従います。

  • ソース : BIT

    • ビット・ゼロは文字のゼロになり、ビット1は文字の1になります。

    • NULLビット文字列は、NULL文字列になります。

  • ソース : GRAPHIC

    • DBCSに対応するSBCS(Single-byte Character Set、1バイト文字セット)がある場合にSBCSに変換されます。そうでない場合には、CONVERSION条件が起こります。

2.4.8. ターゲット: BIT

  • ソース : FIXED BINARY、FIXED DECIMAL、FLOAT BINARY、FLOAT DECIMAL

    • 算術値が2進数に変換されます。符号と小数点以下の桁は無視されます。結果2進値は、ビット文字列と見なされます。

    • まず、変換規則に従ってFIXED DECIMALに変換されます。次に、同じ変換規則でFIXED DECIMALからCHARACTERに変換されます。

  • ソース : FIXED BINARY( p1, q1 )

    • 中間結果のビット文字列の長さです。

      min(M, p1 - q1)

      p1 - q1 <= 0のときは、NULLビット文字列が生成されます。

    • 以下は、変換例です。

      精度 文字列

      ( 1)

      1

      '1’B

      ( 3)

      -5

      '101’B

      ( 4, 2 )

      2.43

      '10’B

  • ソース : FIXED DECIMAL( p1, q1 )

    • 中間結果のビット文字列の長さです。

      min(M, CEIL( (p1 - q1) * 3.32))

      p1 - q1 <= 0のときは、NULLビット文字列が生成されます。

    • 以下は、変換例です。

      精度 文字列

      ( 1)

      1

      '00001’B

      ( 2, 1)

      -1.8

      '0001’B

  • ソース : FLOAT BINARY(p1)

    • 中間結果のビット文字列の長さです。

      min(M, p1)
  • ソース : FLOAT DECIMAL(p1)

    • 中間結果のビット文字列の長さです。

      min(M, p1 * 3.32)
  • ソース : 算術文字PICTURE

    • 指定された算術値をDECIMAL値として解析し、FIXED DECIMALまたはFLOAT DECIMALからBITへの変換規則が適用されます。

  • ソース : CHARACTER

    • 文字のゼロはビットのゼロになり、文字の1はビットの1になります。ゼロと1以外の文字には、CONVERSION条件が起こります。

    • NULL文字の文字列は、NULLビット文字列になります。

  • ソース : GRAPHIC

    • DBCSのゼロはビットのゼロになり、DBCSの1はビットの1になります。それ以外のDBCS文字には、CONVERSION条件が起こります。

    • NULL文字列は、NULLビット文字列になります。

2.4.9. ターゲット: GRAPHIC

グラフィック・ソースでないものは、まず、CHARACTERに変換されます。結果文字列は、DBCS文字列に変換されます。

3. データ宣言

PL/Iプログラムが実行されるとき、様々なデータ項目が処理されます。名前が付いていない定数を除いたデータ項目を使用するには、属性と名前などのデータ情報を宣言する必要があります。データ項目、タイプ、属性の詳細については、データ・エレメントを参照してください。

本節では、明示的または暗黙的な宣言、スカラー、配列、構造体の宣言、変数名の有効範囲、データの位置合わせ、デフォルトの属性について説明します。

3.1. 明示宣言

データ項目の名前は、以下のような状況で明示的に宣言されます。明示的に宣言されたデータ項目の有効範囲は、宣言を含むブロックです。

  • DECLAREステートメントに記述されるとき、DECLAREステートメントはデータ項目の名前と属性を明示的に宣言します。

  • 入り口定数として宣言します。PROCEDUREとENTRYステートメントのラベルに使用された名前は明示的に入り口定数を宣言します。

  • フォーマット定数として宣言します。FORMATステートメントのラベルに使用された名前は明示的にフォーマット定数を宣言します。

  • ラベル定数として宣言します。ラベルに使用された名前は明示的にラベルを宣言します。

以下の図は、明示宣言の有効範囲を示す例です。BとB’は、同じ名前の別の宣言を区別するために使用されており、CとC’も同様です。

figure scope

3.1.1. DECLAREステートメント

DECLAREステートメントは、データ項目の名前と一部またはすべての属性を記述することができます。明示的に属性が記述されず、コンテキストによって判別できない場合は、デフォルト属性が適用されます。

figure syntax declare
項目 説明

*

スカラー、レベル1データの名前として記述することはできません。

attributes

宣言されるデータの属性を記述します。任意の順序で記述できます。詳細については、 データ・タイプと属性を 参照してください。

level

ゼロ以外の整数である必要があります。スカラー、配列データを宣言するときは記述する必要はなく、レベル1になります。

name

宣言されるデータの名前を記述します。レベル1の名前は、同じブロック内で一意である必要があります。

条件接頭語とレベルは、DECLAREステートメント上には記述できません。

3.2. 暗黙宣言

プログラム内で使用するデータ項目の名前が明示的に宣言されなかった場合は暗黙的に宣言されます。その項目の名前が使用された外部プロシージャのPROCEDUREステートメントの後に宣言を記述した場合と同じ有効範囲を持ちます。黙示宣言したデータ項目の一部の属性は、コンテキスト上から判定されます。これはコンテキスト宣言と呼ばれており、以下のような場合です。

  • 組み込み関数の名前

  • PROCEDUREとENTRYステートメントにパラメータ・リストに記述されたデータ項目は、PARAMETER属性を持ちます。

  • ファイル名が使用されるべき場所に記述されるなら、FILE属性を持ちます。

  • ON CONDITION、SIGNAL CONDITION、REVERT CONDITIONステートメントに記述されたデータ項目は、CONDITION属性を持ちます。

  • BASED属性に記述された名前、またはロケーター修飾記号の左側に記述される場合は、POINTER属性を持ちます。

黙示的に宣言されるとき、属性がコンテキスト宣言として判定できない場合、デフォルト属性は、属性のデフォルトで決まります。コンテキスト宣言は明示宣言内に存在しないため、明示宣言をコンテキスト的な判断で属性を追加することはできません。

3.3. 宣言の有効範囲

ほとんどの場合、宣言されたデータ項目の有効範囲はプログラム内で宣言された位置によって決まります。暗黙宣言は、外部プロシージャのPROCEDUREステートメントの後にDECLAREステートメントが記述されたのと同じ有効範囲を持ちます。

特定のブロックに明示宣言された名前は、そのブロック内だけで意味を持ちます。そのブロックの外では、同じ名前が宣言されていない限りその名前は認識されません。そのブロックの外で同じ名前で宣言された場合、外のブロックではブロック内とは別のデータ項目を参照することになります。この特性により、プログラムでローカル定義の指定が可能になります。

以下の例において、PUTステートメントによる結果AはC.Aを参照するため「FUNC1」です。結果Bは、プロシージャTESTに宣言された「TEST」になります。

    TEST: PROC OPTIONS(MAIN);
      DCL (X,Y) CHAR(5) INIT('TEST ');
      CALL FUNC1;

      FUNC1: PROC ;
        DCL 1 C,
              3 A CHAR(5) INIT('FUNC1');
        PUT DATA( A, B );
       END FUNC1;
    END TEST;

3.3.1. INTERNAL属性とEXTERNAL属性(略語: INT, EXT)

INTERNALとEXTERNAL属性は、参照有効範囲を定義します。

figure syntax scope attribute

INTERNALは、内部プロシージャの入り口名とすべての変数のデフォルト属性です。ただし、入り口定数、ファイル定数、ユーザー定義の条件は除外します。INTERNALは、宣言されたブロック内でのみ参照有効範囲を指定します。

EXTERNALは、ファイル定数と内部プロシージャを除いた入り口定数、ユーザー定義条件のデフォルト属性です。EXTERNAL属性を持つ名前は、別の外部プロシージャで複数回宣言することができます。すべての宣言は、同じデータを参照するためにEXTERNAL属性の同じ名前を持ちます。

    TEST1: PROC;
      DCL 1 X EXTERNAL,
          3 A.
          3 B;
    ...
    END TEST1;

    TEST2: PROC;
      DCL 1 X EXTERNAL,
          3 A.
          3 Y;
    ...
    END TEST2;

TEST1でX.Aが変更されると、TEST2のX.Aも変更されます。TEST1のX.Bが変更されたら、TEST2のX.Yも変更されます。構造体のメンバーは、常にINTERNAL属性を持ちます。EXTERNALとして宣言する場合、同じデータを参照するので、メンバー属性は同じでなければなりません。

3.4. データの位置合わせ

コンピューターは、バイト、ハーフワード、フルワードまたはダブルワード単位でアクセスします。

ハーフワードは、連続している2バイト、フルワードは連続している4バイト、 ダブルワードは、連続している8バイトです。 したがって、ハーフワードの位置合わせは2の倍数、フルワードの位置合わせは4の倍数、フルワードの位置合わせは8の倍数のアドレスにアクセスします。

PL/Iはこのようなワード単位のデータ位置合わせをサポートします。ただし、連続するデータ項目間の未使用バイトが存在する場合があります。この場合、追加的なストレージが必要となります。

ALIGNED属性とUNALIGNED属性により、ワード単位のデータ位置合わせを使用するかどうかを選択できます。

3.4.1. ALIGNED属性とUNALIGNED属性

ALIGNED属性を指定すると、データ項目のデータ・タイプに合うストレージ境界でデータが位置合わせされます。

UNALIGNED属性は、次のバイトでデータがマップされるように指定します。ただし、固定長のビット文字列は、次のビットでマップされます。

figure syntax alignment attribute
変数タイプ ストレージ・サイズ(バイト) ALIGNEDデータの位置合わせ要件 UNALIGNEDデータの位置合わせ要件

BIT(n)

ALIGNED: CEIL(n / 8) UNALIGNED: n bits

Byte

Bit

CHARACTER(n)

n

Byte

Byte

GRAPHIC(n)

2n

Byte

Byte

PICTURE

PICTURE文字の数(V、K、Fを除く)

Byte

Byte

DECIMAL FIXED(p,q)

CEIL((p + 1) / 2)

Byte

Byte

BINARY FIXED(p, q) SIGNED 1 <= p <= 7 UNSIGNED 1 <= p <= 8

1

Byte

Byte

CHARACTER(n) VARYING

n + 2

Halfword

Byte

BINARY FIXED(p, q) SIGNED 8 <= p <= 15 UNSIGNED 9 <= p <= 16

2

Halfword

Byte

BINARY FIXED(p, q) SIGNED 16 <= p <= 31 UNSIGNED 17 <= p <= 32

4

Fullword

Byte

BINARY FLOAT(p) 1 <= p <= 21

4

Fullword

Byte

DECIMAL FLOAT(p) 1 <= p <= 6

4

Fullword

Byte

POINTER

8 for 64bit

Doubleword

Byte

FILE

8 for 64bit

Doubleword

Byte

ENTRY

8 for 64bit

Doubleword

Byte

LABEL

8 for 64bit

Doubleword

Byte

FORMAT

8 for 64bit

Doubleword

Byte

BINARY FIXED(p, q) SIGNED 32 <= p <= 63 UNSIGNED 33 <= p <= 64

8

Doubleword

Byte

BINARY FLOAT(p) 22 <= p <= 53

8

Doubleword

Byte

DECIMAL FLOAT(p) 7 <= p <= 16

8

Doubleword

Byte

3.5. 属性のデフォルト

PL/Iプログラムで使用する名前には、完全な属性のセットが必要です。プロシージャに渡された引数は、プロシージャのパラメータと一致する属性を持っている必要があります。関数が返す値は、予測される属性を持っていなければなりません。ただし、指定した属性は完全な属性のセットを含むことを必要としません。

以下の属性セットは、言語に固有のデフォルトを使用するか、DEFAULTステートメントを使って固有のデフォルトを変更して、まったく新しい完全なデフォルト・セットを実装してから完全になります。

  • 明示的に宣言された名前

  • コンテキストによる宣言や暗黙的に宣言された名前

  • パラメータ記述子に含まれた属性

  • 関数プロシージャから返される値

デフォルトで適用される属性は、明示宣言またはコンテキスト宣言による名前に適用される属性を再定義することはできません。

3.5.1. 言語に固有のデフォルト

データ属性が指定されていない変数には、デフォルトとして算術属性が与えられます。

モード、スケール、基数がDECLAREステートメントまたはDEFAULTステートメントによって指定されていない場合、コンパイラーで提供するDEFAULTは以下のような属性を決定します。

  • DEFAULTが適用される場合、文字IからNで始まる名前を持つ変数は、REAL FIXED BINARY(15,0)の属性が与えられます。

  • それ以外の名前を持つ変数は、REAL FLOAT DECIMAL(6)の属性が与えられます。

スケール変数が精度属性に指定された場合、FIXED属性は別の属性が適用される前に適用されます。したがって、BINARY(p,q)属性を持つ宣言は常にFIXED BINARY(p,q)属性を指定した宣言と同じになります。

精度が算術宣言に指定されていない場合、コンパイラーで提供するDEFAULTは、規則に従って以下のように精度を決定します。

属性 DEFAULT(IBM)

FIXED DECIMAL

(5,0)

FIXED BINARY

(15,0)

FLOAT DECIMAL

(6)

FLOAT BINARY

(21)

ENTRY宣言にいかなる記述(description)も指定されていない場合、引数の属性は、呼び出されたプロシージャ内のパラメータに指定された属性と一致する必要があります。

以下に例を示します。

DECLARE X ENTRY;
CALL X(1);

引数は、REAL FIXED DECIMAL(1, 0)の属性を持ちます。以下のように、プロシージャXが別の属性を持つパラメータを宣言した場合はエラーになります。

X: PROC(Y);
 DECLARE Y BINARY FIXED(15);

入り口宣言がすべてのパラメータの属性を指定すれば、このような問題は簡単に回避することができます。

3.5.2. DEFAULTステートメント(略語: DFT)

DEFAULTステートメントは、属性セットが完全ではない場合にデータ属性のデフォルトを定義します。

暗黙宣言とコンテキスト宣言または部分的に完全な明示宣言の場合、DEFAULTステートメントが適用されない属性については、言語に固有のデフォルトが適用されます。

DEFAULTステートメントはENTRY属性またはFILE属性で宣言された名前を除いて、すべての別の属性を再定義します。ただし、VARIABLEを暗示する属性のない名前は、DEFAULTステートメントが適用される前にPL/Iによって暗黙的にCONSTANT属性が提供されます。構造体と共用体のエレメントには、修飾されたエレメントの名前ではなく、エレメントの名前に応じてデフォルト属性が適用されます。

figure default stmt1

identifier:

image

項目 説明

RANGE(identifier)

同じ文字で始まる名前に適用されます。

RANGE(identifier : identifier)

2つのIDで指定された文字で始まる名前またはアルファベット順で2つのIDの中間にある名前に適用されます。

RANGE(*)

DEFAULTステートメントの有効範囲内にあるすべての名前に適用されます。

DESCRIPTORS

明示的な入り口宣言のパラメータ記述子リストで該当するパラメータ記述に含まれる属性に適用されます。少なくとも1つの属性が存在している必要があり、ヌル記述子には適用されません。RANGE()の位置にRANGE()の代わりに使用します。

attribute_specification

  • attribute-list

    データ項目の宣言を完成させるためだけに必要な属性です。FILEを使用した場合は、VARIABLEとINTERNAL属性が指定できます。次元属性は、属性指定の最初の項目で定義できます。境界は算術定数または式として指定可能であり、REFERオプションを含むことができます。次元属性は、明示的に宣言された名前にだけデフォルト値を適用することができます。INITIAL属性も適用できます。

  • VALUE

    attribute_specificationに含まれるVALUE属性は、次元属性の前を除いて、attribute_specificationの中のどこにでも書くことができます。

    VALUEは、区域のサイズ、文字列の長さ、数値精度に関するデフォルトの規則を定義します。VALUE句の中のサイズ、長さ、精度は、システム・デフォルト属性の適用後ではなく、デフォルトが適用される前に適用されます。

    以下に例を示します。

    DEFAULT RANGE(I) VALUE(FIXED DECIMAL(7,3));
    I = 2;

    明示的に宣言されていない場合、Iには、言語で定められるデフォルトの属性FIXED BINARY(15,0)が与えられます。上記のDEFAULTステートメントは、FIXED DECIMAL属性を持つ名前に対してデフォルト精度を(7,3)に指定しただけなので、IはDEFAULTステートメントから影響を受けません。

ブロック内に複数のDEFAULTステートメントを指定することができます。

DEFAULTステートメントの適用範囲は、それが指定されているブロック、および、そのブロック内で、同じ範囲を持つ別のDEFAULTステートメントを含まず、かつ同じ範囲のDEFAULTステートメントを持つブロック内にも含まれていないすべてのブロックです。つまり、同じ範囲のDEFAULTステートメントが宣言されているブロックがあり、ブロック内にあるブロックでは、ブロック内で宣言された同じ範囲のDEFAULTステートメントの属性が先に適用されます。

内部ブロックでのDEFAULTステートメントは、明示的に宣言された名前に対してのみ有効です。これは、暗黙宣言の場合、その名前が使用されている外部プロシージャのPROCEDUREステートメントの直後に存在するDECLAREステートメントでその名前が宣言されているかのように宣言の範囲が決定されるからです。

以下に例を示します。

 X: PROC;
 LABEL1: DEFAULT RANGE(AB) FLOAT;
  Y: BEGIN;
 LABEL2: DEFAULT RANGE(ABC) FIXED;
 END X;

LABEL1のDEFAULTステートメントの範囲は、プロシージャXとプロシージャ内に含まれている開始ブロックYです。LABEL1のDEFAULTステートメントで指定した範囲は、プロシージャXと開始ブロックYに宣言されている文字ABで始まるすべての名前です。ただし、開始ブロックYでは、文字ABCで始まる名前は除きます。

3.5.3. 言語に固有のデフォルトの復元

以下のDEFAULTステートメントは、包含ブロック内で確立されたプログラマー定義のデフォルト規則に従って、すべての名前を再定義します。これを使用すると、被包含ブロックのために言語固有のデフォルトを復元することができます。

DEFAULT RANGE(*) SYSTEM;

3.6. 配列

配列は、同じ属性を持つエレメントのn次元の集合です。配列の各項目は、配列内の位置を使用して参照(添え字を使用)することができます。REFER引数を使用しない限り、配列はすべての次元に、少なくとも1つのエレメントが必要です。

3.6.1. DIMENSION属性(略語: DIM)

DIMENSION属性には、次元の数と上限(upper bound)、下限(lower bound)を記述します。エクステントとは、上限値と下限値の間にある整数の個数です。

figure syntax dimension attribute

DIMENSIONキーワードが省略される場合、DIMENSION属性は宣言内の名前の直後に位置しなければなりません。

境界(Bound)の指定は、以下に従います。

  • 上限だけを指定すると、下限にはデフォルトの1が設定されます。

  • 下限は上限以下である必要があります。

  • アスタリスク(*)が記述された場合、そのパラメータに関連する引数から取得できます。

3.6.2. 添え字

以下は、エクステントが7で、境界が-2:4である配列が宣言された例です。

DCL X(-2:4) FIXED DEC(7);

ここに、1、2、3、4、5、6、7という値が割り当てられた場合、各エレメントの値は以下のとおりです。

X(-2) = 1
X(-1) = 2
X(0)  = 3
X(1)  = 4
X(2)  = 5
X(3)  = 6
X(4)  = 7

配列の各エレメントを参照するため、括弧内に記述された数字の-2から4を添え字(subscript)と言います。

3.7. 構造体

構造体、配列またはスカラー変数のメンバー・エレメントの集合です。構造体の名前は、構造体の全体データを参照するときに使用されます。配列とは違って、構造体のメンバーが別々の属性と名前を持つことができます。参照されないメンバーは、名前としてアスタリスク(*)を使用できます。

構造体はレベルを持ちます。レベル1に記述された名前は、大構造体 と呼ばれます。それより下位レベルの名前は、小構造体になります。最下位レベルの名前は、基本名と呼ばれます。

構造体は、DECLAREステートメントで、変数の名前の前にレベル番号を記述するという方法で宣言できます。レベル番号は整数です。

以下は、構造体を宣言する例です。

 DCL 1 EMPLOYEE,                     /* major structure name */
      3 NAME,                        /* minor structure name */
        5 LAST CHAR(20),             /* elementary name */
        5 FIRST CHAR(20),            /* elementary name */
      3 EMP_NO FIXED DEC(7);         /* elementary name */

構造体のメンバー名が一意である場合、メンバー名だけで構造体のメンバーを参照することができます。ただし、同じ名前が別のメンバー名として使用されている場合には、メンバー名だけでは参照するメンバーを特定することができません。このようなあいまいさをなくし、正しいメンバーを参照するために、修飾された参照を行う必要があります。

修飾は、1つ以上の親メンバーの名前をピリオド(.)でつないで使用します。上記の例で、LASTを参照する場合、修飾された参照は、EMPLOYEE.LASTまたはEMPLOYEE.NAME.LASTになります。修飾は、レベルの順番に従う必要があります。

 DCL Y FIXED INIT(1);
 BEGIN;
   DCL 1 X,
       3 Y FIXED INIT(10);

    DISPLAY (Y);
 END;

PL/Iでは変数宣言の有効範囲がブロック単位で処理されるため、上記例のDISPLAYステートメントで参照する変数のYは、開始ブロックに宣言された変数を先に確認します。

開始ブロック内でYに対するあいまいな参照が発生しないので、Yは開始ブロック内のX構造体のメンバー変数Yを参照して10を出力します。最初にあるYの変数宣言(1を初期値として持つ)が開始ブロック内に宣言されていれば、DISPLAYステートメントで参照する変数Yは構造体のメンバーではなく、スカラー変数Yを参照することになり、出力値は1になります。

 DCL 1 A,
       5 B,
       5 C,
         10 D,
       5 D;

上記の例では、Dは2回宣言されています。A.Dの参照を行うと2番目のD、すなわちレベル番号5に該当するDが参照されます。これは、A.Dが2番目のDのみの完全修飾だからです。最初のDは、A.C.Dとして参照されます。

 DCL 1 A,
       5 B,
         10 C,
       5 D,
         10 C;

上記の例では、A.Cは2つのCのうち、どちらを参照するかがあいまいです。

 DCL 1 A,
       5 A.
         10 A;

上記の例では、Aは最初のAを参照します。A.Aは2番目のAを参照します。A.A.Aは3番目のAを参照します。

 DCL X;
 DCL 1 Y,
       5 X.
         10 Z.
         10 A.
       5 Y,
         10 Z,
         10 A;

上記の例では、Xは最初のXを参照します。Y.Zの参照はあいまいなものとなります。Y.X.Zは最初のZ、Y.Y.Zは2番目のZを参照します。

3.8. LIKE属性

別の構造体の論理的な構造を同一に使用するために宣言する変数にLIKE属性を記述することができます。ターゲットとなる変数のメンバー名および属性は、宣言された名前のメンバーになります。メンバー変数の名前と属性が同じく宣言されるだけで、ターゲットとなる変数の属性と名前は無視されます。

figure syntax like attribute

新しいメンバーを構造体に追加することはできません。

 DCL 1 A(10) ALIGNED STATIC,
       3 B CHAR(10),
       3 C CHAR(10);
 DCL 1 X LIKE A;

上記のような宣言は、以下と同じです。

 DCL 1 A(10) ALIGNED STATIC,
       3 B CHAR(10),
       3 C CHAR(10);
 DCL 1 X,
       3 B CHAR(10),
       3 C CHAR(10);

変数Aの属性DIM(10)、ALIGNED、STATICは、LIKEによって適用されていません。

4. ストレージ管理

すべての変数はストレージが必要です。本節では、PL/Iでストレージを管理する方法について説明します。

ストレージ・クラスの属性

ストレージはには、AUTOMATIC(自動)、STATIC(静的)、CONTROLLED(被制御)、BASED(基底付)の4つのクラスがあります。

クラス 説明

AUTOMATIC

変数が宣言されたブロックが有効になったときに割り当てられ、そのブロックが無効になるとストレージは解放されます。詳細については、AUTOMATIC属性(略語: AUTO)を参照してください

STATIC

プログラムがロードされるときに割り当てられます。プログラム実行が終了されるまでストレージは解放されません。詳細については、STATIC属性を参照してください

CONTROLLED

ALLOCATEとFREEステートメントを使用してストレージの割り当てと解放が行われます。同じ被制御変数を複数回割り振ると、変数のストレージがスタックに蓄積されることになり、世代が管理されます。初期世代の変数を参照するためには、最新の世代を解放する必要があります。詳細については、CONTROLLED属性(略語: CTL)を参照してください

BASED

ALLOCATEとFREEステートメントを使用してストレージの割り当ておよび解放が行われます。被制御変数とは異なり、スタックに蓄積されません。詳細については、BASE属性を参照してください。

ストレージ・クラスの属性は、要素変数、配列変数、大構造変数に明示的に記述できます。ただし、以下のものについては指定できません。

  • CONDITION条件

  • 定義済みデータ項目

  • 入り口定数

  • ファイル定数

  • フォーマット定数

  • ラベル定数

  • 構造体のメンバー

4.1. AUTOMATIC属性(略語: AUTO)

自動変数は、それが宣言されているブロックが開始するときに割り当てられ、ブロックが終了するときに解放されます。

figure syntax automatic attribute

AUTOMATICはデフォルト属性です。自動変数は常に内部変数です。

自動変数のエクステントは制限付き式で記述することができます。ただし、別の変数を参照する式の使用は可能ですが、そのときは参照される変数宣言に初期値が存在しなければなりません。

 DCL N FIXED BIN (31) INIT(15),
     X CHAR(N);

上記の例において、変数Xの文字列長は変数Nに記述されています。変数Nは初期値15を持っているので、Xは長さ15の文字列変数になります。

4.2. STATIC属性

静的変数は、プログラムが実行される前に割り当てられ、そのストレージはプログラムが終了するまで割り当てられたままになっています。

figure syntax static attribute

STATICは外部変数のデフォルトですが、内部変数がSTATICであってもかまいません。また、プロシージャの外で宣言された変数はSTATIC属性を持ちます。

 P: PACKAGE;
    DCL A CHAR(10);

    FUNC1: PROC OPTIONS(MAIN);
        FUNC2: PROC;
            DCL B STATIC INTERNAL;
        END FUNC2;
    END FUNC1;


    FUNC3: PROC;
        Y = 'TEST';
    END FUNC3;
 END P;

上記の例において、変数BはSTATICストレージを持ち、プログラムが開始するときに割り当てられます。ただし、Bへの参照は宣言Bを含むブロックFUNC2内でのみ可能です。変数AはSTATIC属性を持つことになり、STATICストレージを有します。

静的変数がINITIAL属性を使用して初期化する場合、初期値は必ず制限付き式でなければなりません。配列のエクステントも、制限付き式で記述する必要があります。制限付き式とは、コンパイル時に定数値が決定される式です。

4.3. CONTROLLED属性(略語: CTL)

CONTROLLED属性として宣言された変数は、ALLOCATEステートメントを通じて割り当てられ、その変数はFREEステートメントによって解放されるか、プログラムの終了時に解放されます。割り当てられてない被制御変数を参照するとエラーが発生します。

被制御変数として宣言されていない変数を被制御変数をパラメータとして有するプロシージャを呼び出すときは使用できません。

figure syntax controlled attribute

以下は、被制御変数を使用する例です。

  FUNC1: PROC;
      DCL X(M,N) CONTROLLED;
      DCL M FIXED, N FIXED;
      ...
      CALL FUNC2;
      FUNC2: PROC;
        GET LIST(M,N);
        ALLOCATE X;
        GET LIST(X);
        ...
      END FUNC2;
      ...
      FREE X;
  END FUNC1;
被制御変数の世代管理

ALLOCATEステートメントが実行されると、被制御変数に対してストレージを割り当て、スタックに入れます。したがって、すでに割り当てられていて解放されていないストレージはスタックの下方に移動されます。このようなスタッキングが行われると、その変数の新しい世代が作られます。

この新しい世代が現行世代となり、前の世代は現行世代が解放されない限り、直接にアクセスできません。FREEステートメントが実行されると、スタックから現行世代のストレージを取り出し、割り当てを解放します。したがって、直前の世代が現行世代となります。

4.3.1. 被制御変数のALLOCATEステートメント

ALLOCATEステートメントは、被制御変数にストレージを割り当てます。同時に被制御パラメータも割り当てることができます。ALLOCATEステートメントに被制御変数の配列の境界、文字列の長さを指定することができます。

figure syntax allocate controlled

配列の境界、文字列の長さは、ALLOCATEステートメントの実行時に計算されます。

  • ALLOCATEステートメントまたはDECLAREまたはDEFAULTステートメントに必要なサイズと文字列の長さが指定されている必要があります。

  • ALLOCATEステートメントにDIMENSION属性と文字列の長さが指定された場合、変数宣言に記述されている属性の代わりになります。

  • ALLOCATEステートメントに境界、文字列の長さがアスタリスク(*)で記述された場合、現行世代の情報を使用します。変数の現行世代が存在しない場合は、その情報は未定義となり、プログラムはエラーになります。

  • ALLOCATEステートメントに記述されたDIMENSION属性は、宣言された次元の数値に合わせて記述しなければなりません。すなわち、1次元の配列であれば、DIMENSION属性が1つ記述され、2次元の配列の場合は2つ、 ...、n次元の配列の場合にはnつのDIMENSION属性が記述される必要があります。

  • BIT、CHARACTE、GRAPHICの属性は、DECLAREステートメントに記述されている属性と同じである必要があります。

以下は、ALLOCATEステートメントを使用した例です。

  DCL X(M,N) CHAR(L) CTL;
  M = 10;
  N = 5;
  L = 100;
  ALLOCATE X(5,5) CHAR(200);

4.3.2. 被制御変数のFREEステートメント

被制御変数に割り当てられているストレージを解放します。

figure syntax free controlled

4.3.3. アスタリスクの表記

ALLOCATEステートメントでは、次元、文字列の長さがアスタリスク(*)で記述されると、その値は現行世代の値を使用します。配列の場合、アスタリスク(*)は、次元の数の分だけ記述される必要があります。

  DCL X(M,N) CHAR(L) CTL;
  M = 10;
  N = 5;
  L = 100;
  ALLOCATE X;
  ALLOCATE X(5,5) CHAR(200) ;
  ALLOCATE X(*,*) CHAR(*);

上記の例において、変数Xの最初の世代は、境界(10,5)、文字列長は100を持ちます。2番目と3番目の世代は、境界(5,5)、文字列長は200を持ちます。

4.3.4. 調整可能なエクステント

被制御スカラー、配列、構造体のメンバーは、配列のエクステントと文字列長を世代別に調整することができます。

以下の例において、構造体がALLOCATEステートメントによって割り当てられると、X.Yは1から8の境界を持つ配列になり、X.Zは長さ4を持つ可変長の文字列となります。

  DCL 1 X CTL,
        3 Y(M:N).
        3 Z CHAR(*) VARYING;
  M = -4;
  N = 4;
  ALLOC 1 X, 3 Y(1:8), 3 Z CHAR(4);
  FREE A;

4.4. BASE属性

基底付き変数の宣言は、必要なストレージのサイズと属性についての記述です。ロケーターを利用してストレージの位置を識別します。割り当てられてない基底付き変数の値を参照すると、エラーになります。

ストレージは、ALLOCATEステートメントによって割り当てられ、FREEステートメントのよって解放されます。

figure syntax based attribute

基底付き変数にEXTERNAL属性を付けることはできません。すべての変数に対してロケーター参照が可能です。

基底付き変数の宣言でのエクステント記述

REFERオプションを使用しない場合、基底付き変数の宣言でのエクステント記述は、以下を除いて制限付き式である必要があります。

  • 定数ではない配列のエクステントを使用する場合、以下の条件を満たしている必要があります。

    • 1次元の配列であること。

    • 下限は定数であること。

    • 構造体の一部の場合、別のすべてのメンバーのエクステントは定数であり、その配列メンバーおよび親構造体の次のメンバーが存在しないこと。

  • 定数ではないCHARACTER文字列エクステントを使用する場合、以下の条件を満たしている必要があります。

    • 構造体の最後のメンバーであること。

    • 親構造体が配列ではないこと。

    • UNALIGNED、NONVARYINGのうち、いずれかの属性を持つこと。

  • 以下は、定数ではないエクステントを持つことができます。

    • BITエクステント

    • GRAPHICエクステント

4.4.1. ロケーター変数

ロケーター変数は、基底付き変数のストレージ位置を指します。現在のPL/Iでは、ロケーター変数としてポインター変数のみをサポートします。

以下の例において、Xへの参照はXのストレージ・アドレスを指しているロケーター変数Pを使用して行われます。

 DCL X CHAR(10) BASED (P);

基底付き変数がロケーターなしで宣言された場合、基底付き変数の参照は以下の例のように明示的にロケーター修飾を使用する必要があります。

 DCL X CHAR(5) BASED ;
 DCL Y CHAR(10);
 DCL Z CHAR(20);
 DCL P PTR;
 P = ADDR(Y);

 Z = P->X;

以下の例において、配列AとCは同じストレージを持ちます。BとC(2,1)も同じストレージを持ちます。

 DCL A(3,2) CHAR(5) BASED (P);
 DCL B CHAR(5) BASED(Q);
 DCL C(3,2) CHAR(5);
 P = ADDR(C);
 Q = ADDR(A(2,1));

4.4.2. ロケーター修飾

ロケーター修飾は、「->」記号を使用して1つ以上の修飾子を記述します。

figure syntax locator qualification

以下の例において、Xは基底付き変数、Pはロケーター変数、Qは基底付きロケーター変数です。

 P->Q->X

この参照は、ロケーターPの値は基底付きロケーターQのアドレスです。このアドレスに存在するQの値は、基底付き変数Xのアドレスです。したがって、Xの参照はこのアドレスを参照します。

基底付き変数の参照は暗黙に修飾することもできます。

以下の例において、ALLOCATEステートメントはX変数に割り当てたストレージのアドレスをポインター変数Pに保存します。

 DCL X FIXED BIN BASED(P);
 ALLOC X;
 X = 3;

「X = 3;」でのXの参照はPという暗黙のロケーター修飾子によって行われます。このステートメントは、「P→X = 3;」と同じです。

  DCL (P(10),Q) PTR,
       R PTR BASED(Q),
       V BASED(P(3)),
       W BASED(R),
       Y BASED;
  ALLOCATE R,V,W;

上記の例に対して以下の参照は有効です。

  P(3)->V
  V
  Q->R->W
  R->W
  W

最初の2つの参照は同じです。その次の3つも同じことを意味します。Yを参照するときは、それを修飾するロケーター変数を指定する必要があります。

4.4.3. POINTER属性(略語: PTR)

ポインター変数は、基底付き変数の宣言内のBASED属性に記述されるか、ALLOCATE、LOCATE, READ、FETCHステートメントのSETオプションに記述される場合にはコンテキスト上から宣言されます。また、POINTER属性を明示的に宣言することもできます。

figure syntax pointer attribute

4.4.4. 基底付き変数のALLOCATEステートメント

ALLOCATEステートメントは基底付き変数のストレージを割り当て、ロケーター変数にストレージ・アドレスを保存します。

figure syntax allocate based

割り当てられるストレージのサイズは、基底付き変数の属性とALLOCATEステートメントの実行時に決定されるサイズ、文字列長によって決まります。

4.4.5. 基底付き変数のFREEステートメント

基底付き変数に割り当てられているストレージを解放します。

figure syntax free based

4.4.6. REFER属性

基底付き構造体で、文字列長または配列の境界を参照オブジェクト(REFERオブジェクト)と呼ばれる変数を使用して、宣言された構造体内に定義することができます。構造体のストレージが割り当てられるとき、参照オブジェクトの変数値が保存されます。

figure syntax refer attribute

以下に例を示します。

 DCL 1 VAR BASED(P),
       3 A FIXED BINARY (31),
       3 B (UBND REFER(A));
 DCL UBND FIXED BINARY(31) INIT(100);

VARが割り当てられるとき、配列Bの上限は変数UBNDの現行値を持ち、この値は、変数Aに保存されます。その後、Bを参照すると下限はAから得られます。

4.5. INITIAL属性(略語: INIT)

変数のストレージが割り当てられるときに初期値を指定します。INITIAL属性は、定義済みデータ、パラメータに使用できません。

figure syntax initial attribute
項目 説明

*

エレメントを反復因数として使用する場合を除いて、残りのエレメントを初期化しないために記述します。

iteration factor

反復項目が何回反復されるかを指定します。主に配列に使用されます。

アスタリスク(*)が使用されると、残りのエレメントを反復項目に指定された値に初期化します。

constant、reference、expression

初期値を指定します。

以下は、反復因数の使用例です。

 ((2)'A')     ==> ('AA')
 ((2)('A'))   ==> ('A', 'A')
 ((2)(1)'A')  ==> ('A', 'A')
 ((*)(1)('A') ==> ('A', 'A', ..., 'A')

以下は、INIT属性を使用して初期化が行われる例です。

 DCL X FIXED DEC (7,3) INIT( 34.503 );
 DCL Y CHAR(10) INIT( 'TEST INIT');
 DCL Z (100,10) FIXED DEC(5) INIT( (920)0, (20) ((3)5, 9) );

最後のZは100*10配列です。すなわち、1000個のエクステントを持ちます。INIT属性によって920個はゼロに初期化され、残りの80個には5, 5, 5, 9の値が反復して初期化されます。

4.6. AREAデータ

AREA変数は、基底付き変数(Based variable)の割り当てと解除のための領域を定義することができます。AREA変数はAREA属性を使用して宣言することが可能であり、4つのストレージ・クラスのいずれかを持つことができます。

AREAのサイズは、文字列長や配列サイズの指定と同様な方法で指定することができます。アスタリスク(*)およびREFERオプションを使用することができます。

figure syntax area attribute
項目 説明

expression

AREAのサイズを指定します。

式あるいはアスタリスク(*)が指定されていない場合のデフォルト値は1000です。

*

パラメータの場合、AREAのサイズをアスタリスク(*)で指定することができます。

REFER

REFERの詳細については、REFER属性を参照してください。

以下は、AREA変数の宣言例です。

 DECLARE AREA1 AREA(1500),
         AREA2 AREA;

AREAは、定義したサイズとは別に、16バイトの制御情報が追加で定義されます。したがって、AREA1のサイズは1516、AREA2のサイズは1016となります。制御情報には、現在のストレージ使用量が保存されています。

基底付き変数をAREAに割り当てるとAREAの一部の領域が返され、解除すると、別の変数の割り当てに当該領域を使用することができなす。AREAは、現在割り当てられているストレージをチェーンで管理し、チェーンの最初の部分は制御情報に保存されます。制御情報フィールドを任意で修正すると、予期しないエラーが発生することがあります。

割り当てる基底付き変数のサイズより、残りのAREA領域が小さい場合、AREA条件が起こります。

4.7. DEFINED属性とPOSITION属性(略語: DEF、POS)

DEFINED属性を持っていれば、基本変数のストレージの一部または全体を、宣言された変数のストレージとして使用することができます。

figure syntax defined attribute
項目 説明

reference

宣言された変数のストレージを持っている基本変数です。

基本変数は、BASED、DEFINEDであってはなりません

定義済み変数は、基本変数の属性を継承しません。定義済み変数は、INTERNALであり、レベル1の変数である必要があります。この変数はDIMENSION属性を持つことができます。INITIAL、AUTOMATIC、BASED、CONTROLLED、STATIC、PARAMETERであってはなりません。

3つのタイプの定義済み変数があります。ただし、iSUBはサポートしません。

  • 単純

  • iSUB

  • 文字列オーバーレイ

タイプは以下のように決定されます。

  1. POSITION属性が指定されている場合は、文字列オーバーレイ定義タイプです。

  2. POSITION属性が指定されていない場合は、プログラムの呼び出し時にパラメータと引数間のマッチング・ルールを使用して定義済み変数と基本変数の属性を比較します。このとき、一致していれば(DEFINED属性を除く)単純定義タイプになります。ただし、パラメータの配列の境界、文字列の長さがすべてアスタリスク(*)によって指定されていることが前提となります。つまり、配列の境界、文字列長の属性は比較しません。

  3. 上記以外の場合は、文字列オーバーレイ定義タイプです。

単純定義

単純定義によって、スカラー、配列、構造体などの変数を別の名前で参照できます。定義済み変数と基本変数のALIGNEDとUNALIGNED属性は一致している必要があります。

 DCL X(5,5,5);
 DCL A(2,2,2) DEF X;
 DCL B(5,5) DEF X((*,*,5);
 DCL C DEF X(L,M,N);

AはX(2,2,2)の配列から作られる3次元配列です。BはX((1,1,5)からX(5,5,5)に該当する2次元配列になります。この2つの定義済み変数のストレージは連続していないため、未接続ストレージを持ちます。

現在のOpenFrame PL/Iでは、未接続ストレージはサポートしていません。

Cは、添え字L、M、Nの現行値に該当するX(L,M,N)のストレージを参照します。

 DCL X CHAR(100),
     Y CHAR(10) DEF X;

Yは、Xの最初の10文字からなる文字列です。

文字列オーバーレイ定義

定義済み変数と基本変数が文字列またはピクチャー・データである必要があります。ALIGNED、VARYING属性を持つことはできません。

 DCL X CHAR(100),
     Y(10,10) CHAR(1) DEF X;
 DCL A(10) CHAR(1),
     B CHAR(10) DEF A;
POSITION属性

文字列オーバーレイ定義だけで使用できます。基本変数内で定義済み変数の開始位置を指定します。

 DCL B(10,10) BIT(1),
     X BIT(40) DEF B POS(20);

Xは、Bの20番目のエレメントから40個のエレメントで構成されたビット文字列です。

 DCL A PIC '999V.999',
     X(7) CHAR(1) DEF (A),
     Y CHAR(3) DEF (A) POS(5),
     Z(4) CHAR(1) DEF(A) POS(3);

Xは、ピクチャー・データAのエレメントで構成された文字列です。Yは、ピクチャー・データAの最後の3文字「999」に該当する文字列です。Zは、ピクチャー・データAの「9.99」に該当する文字列です。

 DCL X(20) CHAR(10),
     Y(10) CHAR(5) DEF (X) POSITION(1);

Yは、X文字列の最初の50文字で構成された文字列です。POSITION(1)は必ず指定しなければなりません。そうしない場合は、単純定義が使用され、結果は異なったものになります。

4.8. OFFSETデータ

OFFSET変数は割り当てられた基底付き変数の位置がAREAの開始点からどれくらい離れているかを示します。

figure syntax offset attribute

OFFSET変数は、AREA変数が指定されていると、AREAと関連付けされ、POINTER値で変換されることができます。AREA変数が指定されていない場合は、POINTER組み込み関数を使用してAREA変数を指定する必要があります。

以下は、OFFSET変数に値を保存する方法です。

  • ALLOCATEステートメント

  • 他のOFFSET変数またはPOINTER変数の値を保存

  • ADDR、OFFSET、NULLなどの組み込み関数を使用