目的
タイプ宣言ステートメント TYPE は、派生型のオブジェクトと関数のタイプと属性を指定します。オブジェクトには初期値を割り当てることができます。
構文
>>-TYPE--(--type_name--)--+-::--------------------+-------------> '-,--attr_spec_list--::-' >--entity_decl_list-------------------------------------------->< |
それぞれの意味は次のとおりです。
attr_spec |
---|
ALLOCATABLE AUTOMATIC DIMENSION (array_spec) EXTERNAL INTENT (intent_spec) INTRINSIC OPTIONAL PARAMETER POINTER PRIVATE PROTECTED PUBLIC SAVE STATIC TARGET VALUE VOLATILE |
または =>NULL()
を entity_decl の一部として使用する場合に、必要になります。
>>-a--+------------------+--------------------------------------> '-(--array_spec--)-' >--+-----------------------------------+----------------------->< | (1) | '-+-/--initial_value_list--/------+-' +- = --initialization_expr------+ | (2) | '- => --NULL()------------------' 注:
|
+----------------------------------IBM 拡張----------------------------------+
+--------------------------------IBM 拡張の終り-------------------------------+
+---------------------------------Fortran 95---------------------------------+
+------------------------------Fortran 95 の終り------------------------------+
規則
+---------------------------------Fortran 95---------------------------------+
派生型の定義について、以下のことが該当します。
変数に => を指定する場合、オブジェクトに POINTER 属性を指定しなければなりません。
+------------------------------Fortran 95 の終り------------------------------+
変数に initialization_expr を指定する場合、オブジェクトに POINTER 属性を指定できません。
タイプ宣言ステートメント中のエンティティーは、エンティティーに対して指定された属性の規則に従います。詳細は対応する属性ステートメントを参照してください。
1 度派生型を定義した後は、タイプ宣言ステートメント TYPE で、その派生型を利用してデータ項目を定義することができます。エンティティーを派生型に明示的に宣言する場合、その派生型は前もって有効範囲単位内で定義しておくか、または使用関連付けかホスト関連付けによってアクセス可能になっていなければなりません。
データ・オブジェクトは、派生型のオブジェクト か構造体 になります。おのおのの構造体コンポーネント は派生型のオブジェクトのサブオブジェクトです。
DIMENSION 属性を指定すると、データ型が派生型であるエレメントを持つ配列が作成されます。
仕様ステートメント以外では、派生型のオブジェクトを実引き数および仮引き数として使用できます。また、I/O リスト (オブジェクトが、POINTER 属性のコンポーネントを持つ場合を除く)、割り当てステートメント、構造体コンストラクター、およびステートメント関数定義の右側の項目として、派生型のオブジェクトを使用することができます。構造体コンポーネントへのアクセスが不可能な場合、派生型のオブジェクトを I/O リストの中で使用することはできません。また、構造体コンストラクターとして使用することもできません。
非順序派生型のオブジェクトを EQUIVALENCE および COMMON ステートメントのデータ項目として使用することはできません。非順序データ型のオブジェクトは整数のポインティング先にはなれません。
非順序派生型の仮引き数は、使用関連付けまたはホスト関連付けを介してアクセス可能な派生型を指定し、同じ派生型定義が実引き数と仮引き数の両方を定義していることを確認する必要があります。
タイプ宣言ステートメントは、有効な暗黙のタイプの規則をオーバーライドします。
オブジェクトが仮引き数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトをタイプ宣言ステートメントの中で初期化することはできません。
AUTOMATIC 属性を持っているオブジェクトも初期化することはできません。オブジェクトがブロック・データ・プログラム単位内の名前付き共通ブロックにある場合、
またはモジュール内の名前付き共通ブロックにある場合、そのオブジェクトを初期化することができます。
+---------------------------------Fortran 95---------------------------------+
Fortran 95 では、ポインターは初期化することができます。ポインターを初期化するには、=> NULL() を使用する方法しかありません。
+------------------------------Fortran 95 の終り------------------------------+
インターフェース本体、あるいはサブプログラムの指定部分に宣言式がある場合、array_spec の宣言式を非定数式にすることができます。この非定数式を使用する宣言オブジェクトのうち、仮引き数またはポインティング先でないものを自動オブジェクト といいます。
1 つの属性を 1 つのタイプ宣言ステートメントの中で繰り返すことはできません。また、1 つの有効範囲単位内でエンティティーに同じ属性を明示的に複数回与えることもできません。
ステートメントが PARAMETER 属性を持つときは、initialization_expr を指定する必要があります。宣言するエンティティーが変数で、initialization_expr
または NULL()
を指定した場合、変数は最初に定義されます。
+---------------------------------Fortran 95---------------------------------+
宣言するエンティティーが派生型コンポーネントで、 initialization_expr または NULL() を指定した場合は、派生型にはデフォルトの初期化があります。
+------------------------------Fortran 95 の終り------------------------------+
a は、組み込み割り当ての規則に従って、initialization_expr によって決まる値により定義されます。エンティティーが配列である場合は、タイプ宣言ステートメントか、または同じ有効範囲単位内の前の仕様ステートメントで、その配列の形状を指定する必要があります。変数または変数サブオブジェクトを複数回初期化することはできません。a が変数で、initialization_expr
または NULL()
がある場合、a が保管済みオブジェクト (名前付き共通ブロック内のオブジェクトを除く)
であることを意味します。オブジェクトの初期化はオブジェクトの基本的なストレージ・クラスに影響を与える場合もあります。
entity_decl の中で指定されている array_spec は DIMENSION 属性の中の array_spec よりも優先します。
POINTER 属性を持たない配列関数の結果は、明示的形状配列の仕様を持つものでなければなりません。
宣言されたエンティティーが関数の場合、アクセス可能な明示インターフェースを持つことはできません。組み込み関数の場合は、この限りではありません。 FUNCTION ステートメントで派生型を指定できますが、それは、その派生型が関数の本体の中で定義されているか、あるいは、ホスト関連付けまたは使用関連付けを介してアクセスできる場合に限られます。
+----------------------------------IBM 拡張----------------------------------+
事前に定数の名前として定義されている T または F がタイプ宣言ステートメントにある場合、それは省略された論理定数ではなく名前付き定数の名前になります。
+--------------------------------IBM 拡張の終り-------------------------------+
TYPE PEOPLE ! Defining derived type PEOPLE INTEGER AGE CHARACTER*20 NAME END TYPE PEOPLE TYPE(PEOPLE) :: SMITH = PEOPLE(25,'John Smith') END
関連情報