Typedef

型定義 (typedef) は形式のモデルとして使用されるパーツです。 typedef メカニズムは以下のような理由で使用します。

多くの場合、typedef は抽象グループ化を示します。例えば、address という 名前のレコード・パーツを宣言して、情報を streetAddress1streetAddress2、 および city に分割できます。従業員レコードに 構造体フィールド workAddresshomeAddress が 含まれている場合、これらの構造体フィールドはいずれも address という 名前のレコード・パーツの形式を指すことができます。 このように typedef を使用することにより、アドレス形式 が同じになります。

このページに記載された一連の規則の範囲内で、他のパーツを宣言するときや 変数を宣言するときにパーツの形式を指すことができます。

パーツを宣言するときはパーツを typedef として使用する必要はありませんが 、使用しても構いません。使用例を後述します。また、データ項目の特性を持つ変数を宣言するときに typedef を使用する必要はありません。代わりに変数のすべての特性を指定するこ とができます。パーツを参照する必要はありません。

typedef は、データ項目よりも複雑な変数を宣言する場合も常に 有効です。例えば、myRecord という 名前の変数を宣言し、ExampleRecordPart という名前のパーツの形式を 指した場合、EGL では宣言された変数はそのパーツをモデルとします。 ExampleRecordPart02 という名前のパーツの形式を 指した場合は、変数の名前は myRecord になりますが、この変数は ExampleRecordPart02 という 名前のパーツの特性をすべて保持します。

次の表およびセクションに、さまざまなコンテキストにおける typedefs の詳細を示します。

typedef を指すエントリー typedef が参照できるパーツのタイプ
関数仮パラメー ターまたはその他の関数変数 レコード・パーツまたは DataItem パーツ
プログラム・パラメーター DataItem パーツ、フォーム・パーツ、レコード・パーツ
program variable (non-parameter) DataItem パーツ、レコード・パーツ
構造体フィールド DataItem パーツ、レコード・パーツ

typedef としてのデータ項目パーツ

以下のような場合に DataItem パーツを typedef として使用できます。
  • 変数またはパラメーターを宣言するとき
  • レコード・パーツ、フォーム・パーツ、または dataTable パーツのサブユニットである 構造体フィールドを宣言するとき
以下の規則が適用されます。
  • 構造体フィールドが同じ宣言内にリストされた他の構造体フィールドの親である場合、 その構造体フィールドは、以下の例に示すように DataItem パーツの形式のみを 指すことができます。
      DataItem CharPart CHAR(20) end
    
      Record ExampleRecordPart type basicRecord
        10 mySI CharPart; // CharPart が typedef として機能します。
          20 a  CHAR(10);
          20 b  CHAR(10);
      end
    前のレコード・パーツは以下の宣言と同等です。
      Record ExampleRecordPart type basicRecord
        10 mySI CHAR(20);
          20 a CHAR(10);
          20 b CHAR(10);
      end
  • DataItem パーツを typedef として使用することはできません。 また、typedef を指すエンティティーの長さやプリミティブ型を指定することもできません。 以下に例を示します。
      DataItem CharPart HEX(20) end
    
        // mySI が基本型を持ち、パーツの形式
        // (この場合は CharPart) を指すため無効です。
        Record ExampleRecordPart type basicRecord
        10 mySI CHAR(20) CharPart;
      end
  • レコード・パーツを参照しない変数宣言は、DataItem パーツの形式を指すか、 または基本特性を持ちます。(プログラム・パラメーターは、フォーム・パーツも 参照できます。) ただし、DataItem パーツでは別の DataItem パーツの形式や他のパーツを 指すことはできません。
  • SQL レコード・パーツは、typedef として以下のパーツ・タイプのみを使用できます。
    • 別の SQLRecord パーツ
    • DataItem パーツ

typedef としてのレコード・パーツ

以下のような場合にレコード・パーツを typedef として使用できます。
  • 構造体フィールドを宣言するとき
  • 変数 (パラメーターを含む) を宣言するとき。この場合には、変数は以下に関して typedef が反映されています。
    • フォーマット
    • レコード・タイプ (例えば、indexedRecord または serialRecord)
    • プロパティー値 (例えば、file プロパティーの値)

他のパーツの形式を指す構造体フィールドを宣言するときは、 後述するように、typedef によって階層のレベルを追加するかどうかを指定します。

以下の規則が適用されます。
  • 再利用を容易にするために構造体フィールドを使用する場合、レコード・ パーツを typedef として使用できます。
      Record address type basicRecord
        10 streetAddress1 CHAR(30);
        10 streetAddress2 CHAR(30);
        10 city CHAR(20);
      end
    
      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress address;
      end

    2 番目のレコード・パーツは以下の宣言と同等です。

      Record record1 type serialRecord
        { fileName = "myFile" }
        10 person CHAR(30);
        10 homeAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
      end

    構造体フィールドが構造体パーツの形式を指すために前の 構文を使用すると、EGL ではその構造体フィールドを含む構造体パーツに階層レベルが 追加されます。このため、前述の例の内部構造体では構造体とフィールドの間に 階層が生じ、personstreetAddress1 と異なるレベルになります。

  • 場合によっては、単層の構造の方が良い場合もあります。また、リレーショナル・ データベースにアクセスする I/O オブジェクトである SQL レコードは、 単層構造でなければなりません
    • 前出の例では、レコード・パーツの構造体フィールド名 (この場合 homeAddress) を ワード embed と置換して、そのワードの後に typedef として 機能するレコード・パーツ名 (この場合 address) を続ける場合、パーツ宣言は 次のようになります。
        Record address type basicRecord
          10 streetAddress1 CHAR(30);
          10 streetAddress2 CHAR(30);
          10 city CHAR(20);
        end
      
        Record record1 type serialRecord
        {
          fileName = "myFile"
        }
          10 person CHAR(30);
          10 embed address;
        end

      これで、レコード・パーツの内部構造体は以下のように単層になりました。

        Record record1 type serialRecord
        {
          fileName = "myFile"
        }
          10 person CHAR(30);
          10 streetAddress1 CHAR(30);
          10 streetAddress2 CHAR(30);
          10 city CHAR(20);
        end
      構造体フィールド名の位置にワード embed を 使用するのは、階層レベルが追加されるのを避けるためです。 ワード embed で識別される構造体フィールドには、 以下の制限事項があります。
      • レコード・パーツの形式を指すことはできるが、DataItem パーツを 指すことはできない
      • 配列を指定したりプリミティブ型の指定を組み込んだりすることは できない
    • 次に、2 つのレコードに同一構造を宣言する際に、レコード・パーツが typedef に なっている場合を想定します。
        Record common type serialRecord
        {
          fileName = "mySerialFile"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
      
        Record recordA type indexedRecord
        {
          fileName = "myFile",
          keyItem = "a"
        }
          embed common; // accepts the structure of common,
                        // not the properties
        end
      
        Record recordB type relativeRecord
        {
          fileName = "myOtherFile",
          keyItem = "a"
        }
          embed common;
        end

      最後の 2 つのレコード・パーツは、以下の宣言と同等です。

        Record recordA type indexedRecord
        {
          fileName = "myFile",
          keyItem = "a"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
      
        Record recordB type relativeRecord
        {
          fileName = "myOtherFile",
          keyItem = "a"
        }
          10 a BIN(10);
          10 b CHAR(10);
        end
  • 構造体フィールドを連続して宣言するときに、レコード・パーツを typedef として 複数回使用できます。このような再利用は、自宅の住所と職場の住所が含まれた 従業員レコード・パーツを宣言する場合などに有用です。基本レコードを使用して、以下のように構造内の 2 つのロケーションに同じ形式を記述できます。
      Record address type basicRecord
        10 streetAddress1 CHAR(30);
        10 streetAddress2 CHAR(30);
        10 city CHAR(20);
      end
    
      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress address;
        10 workAddress address;
      end

    レコード・パーツは以下の宣言と同等です。

      Record record1 type serialRecord
      {
        fileName = "myFile"
      }
        10 person CHAR(30);
        10 homeAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
        10 workAddress;
          20 streetAddress1 CHAR(30);
          20 streetAddress2 CHAR(30);
          20 city CHAR(20);
      end
  • レコード・パーツを typedef として使用して、さらに typedef を指すエンティティーの 長さまたはプリミティブ型を指定することはできません。 以下に例を示します。
      Record myTypedef type basicRecord
        10 next01 HEX(20);
        10 next02 HEX(20);
      end
    
      // myFirst が基本型を持ち、パーツの形式
      // を指すため無効です。
    Record myStruct02 type serialRecord
      {
        fileName = "myFile"
      }
        10 myFirst HEX(40) myTypedef;
      end
    ただし、以下の例を参照してください。
      Record myTypedef type basicRecord
        10 next01 HEX(20);
        10 next02 HEX(20);
      end
    
      Record myStruct02 type basicRecord
        10 myFirst myTypedef;
      end
    2 番目の構造体は以下の宣言と同等です。
      Record myStruct02 type basicRecord
        10 myFirst;
          20 next01 HEX(20);
          20 next02 HEX(20);
      end

    従属構造体フィールドを持つすべての構造体フィールドの プリミティブ型は、従属構造体フィールドのプリミティブ型に関係なく デフォルトで CHAR であり、構造体フィールドの長さは従属構造体フィールドによって 表されるバイト数です。詳細については、『構造体』を参照してください。

  • SQL レコードに関連して、以下の制限事項があります。
    • SQL レコード・パーツが typedef として他の SQL レコード・パーツを 使用している場合には、typedef が提供するそれぞれのフィールドには、4 バイトの 接頭部が含まれます。しかし、非 SQL レコードが SQL レコード・パーツを typedef として 使用している場合には、接頭部は含まれません。 背景情報については、『SQL レコードの詳細』を参照してください。
    • SQL レコード・パーツは、typedef として以下のパーツ・タイプのみ使用できます。
      • 別の SQL レコード・パーツ
      • DataItem パーツ
  • つまり、構造および構造体フィールドのいずれも typedef として 指定することはできません

typedef としての書式

プログラム・パラメーターを宣言する場合に限り、書式パーツを typedef として使用できます。

フィードバック
(C) Copyright IBM Corporation 2000, 2005. All Rights Reserved.