目的
タイプ宣言ステートメントは、オブジェクトおよび関数のタイプ、長さ、属性を指定します。オブジェクトには初期値を割り当てることができます。
構文
>>-type_spec--+-::--------------------+--entity_decl_list------>< '-,--attr_spec_list--::-' |
それぞれの意味は次のとおりです。
type_spec | attr_spec |
|
|
注:
>>-+-(--+-----------+--int_initialization_expr--)-+------------>< | '-KIND-- = -' | | (1) | '- * --int_literal_constant--------------------'
注:
|
関連するタイプに許されている長さ指定のいずれかを示します。
+----------------------------------IBM 拡張----------------------------------+
int_literal_constant には、kind 型付きパラメーターは指定できません。
+--------------------------------IBM 拡張の終り-------------------------------+
文字長を指定します。
+----------------------------------IBM 拡張----------------------------------+
XL Fortranでは、これは 0 から 256 MB までの文字数です。 256 MB を超える値は 256 MB に設定されます。負の値はゼロに設定されます。値を指定しない場合、デフォルトの長さは 1 です。kind 型付きパラメーターを指定した場合、値は 1 でなければなりません。その値は ASCII 文字を表します。
+--------------------------------IBM 拡張の終り-------------------------------+
>>-+-(--+-LEN--=--type_param_value--,--KIND--=--int_init_expr-----+--)-+-><
| +-type_param_value--,--+---------+--int_init_expr---------+ |
| | '-KIND--=-' | |
| +-KIND--=--int_init_expr--+-----------------------------+-+ |
| | '-,--LEN--=--type_param_value-' | |
| '-+--------+--type_param_value----------------------------' |
| '-LEN--=-' |
'-*--char_length--+---+---------------------------------------------'
'-,-'
ダブル・コロン・セパレーターです。複数の属性を指定する場合、あるいは = initialization_expr
または => NULL()
を使用する場合に必要になります。
>>-a--+-+------------------+--+------------------+-+------------> | '- * --char_length-' '-(--array_spec--)-' | '-(--array_spec--)-- * --char_length---------' >--+-----------------------------------+----------------------->< | (1) | '-+-/--initial_value_list--/------+-' +- = --initialization_expr------+ | (2) | '- => --NULL()------------------'
注:
|
+----------------------------------IBM 拡張----------------------------------+
+--------------------------------IBM 拡張の終り-------------------------------+
+----------------------------------IBM 拡張----------------------------------+
+--------------------------------IBM 拡張の終り-------------------------------+
+---------------------------------Fortran 95---------------------------------+
+------------------------------Fortran 95 の終り------------------------------+
規則
+---------------------------------Fortran 95---------------------------------+
派生型の定義について、以下のことが該当します。
変数に => を指定する場合、オブジェクトに POINTER 属性を指定しなければなりません。
+------------------------------Fortran 95 の終り------------------------------+
変数に initialization_expr を指定する場合、オブジェクトに POINTER 属性を指定できません。
タイプ宣言ステートメント中のエンティティーは、エンティティーに対して指定された属性の規則に従います。詳細は対応する属性ステートメントを参照してください。
タイプ宣言ステートメントは、有効な暗黙のタイプの規則をオーバーライドします。組み込み関数のタイプを確認するためにタイプ宣言ステートメントを使用することができます。タイプ宣言ステートメントの中に組み込み関数の総称名または特定名が使用されていても、その名前は組み込み関数の特性を失うことはありません。
オブジェクトが仮引き数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトをタイプ宣言ステートメントの中で初期化することはできません。
AUTOMATIC 属性を持っているオブジェクトも初期化することはできません。オブジェクトがブロック・データ・プログラム単位内の名前付き共通ブロックにある場合、
またはモジュール内の名前付き共通ブロックにある場合、そのオブジェクトを初期化することができます。
+---------------------------------Fortran 95---------------------------------+
Fortran 95 では、ポインターは初期化することができます。ポインターを初期化するには、=> NULL() を使用する方法しかありません。
+------------------------------Fortran 95 の終り------------------------------+
インターフェース本体、あるいはサブプログラムの指定部分に宣言式がある場合、array_spec または type_param_value の宣言式を非定数式にすることができます。この非定数式を使用する宣言オブジェクトのうち、仮引き数またはポインティング先でないものを自動オブジェクト といいます。
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 に優先します。
ALLOCATABLE または POINTER 属性を持たない配列関数の結果は、明示的形状配列の仕様を持つものでなければなりません。
宣言されたエンティティーが関数の場合、アクセス可能な明示インターフェースを持つことはできません。組み込み関数の場合は、この限りではありません。
+----------------------------------IBM 拡張----------------------------------+
事前に定数の名前として定義されている T または F がタイプ宣言ステートメントにある場合、それは省略された論理定数ではなく名前付き定数の名前になります。
+--------------------------------IBM 拡張の終り-------------------------------+
ステートメント内にダブル・コロン・セパレーター (::) がない場合にのみ、CHARACTER タイプ宣言ステートメントの char_length の後にオプションのコンマを入れることができます。
CHARACTER タイプ宣言ステートメントがモジュール、ブロック・データ・プログラム単位、またはメインプログラムの有効範囲にあり、エンティティーの長さを継承されるものとして指定する場合、そのエンティティーは名前付き文字定数の名前でなければなりません。文字定数は PARAMETER 属性に定義される対応する式の長さになります。
CHARACTER タイプ宣言ステートメントがプロシージャーの有効範囲にあり、エンティティーの長さが継承される場合、そのエンティティーの名前は仮引き数または名前付き文字定数の名前でなければなりません。ステートメントが外部関数の有効範囲にある場合、そのステートメントを同じプログラム単位内の FUNCTION または ENTRY ステートメント内の関数名またはエントリー名にすることができます。エンティティー名が仮引き数の名前の場合、仮引き数はプロシージャーを参照するために、関連する実際の引き数の名前を受け入れます。エンティティー名が文字定数の名前と同じ場合、文字定数は PARAMETER 属性が定義する対応した式の長さを受け入れます。エンティティー名が関数名またはエントリー名と同じ場合、エンティティーは呼び出し側の有効範囲単位内で指定されている長さを受け入れます。
文字関数の長さは、関数のタイプがインターフェース・ブロックで宣言されていない場合は定数式でなければならない宣言式になり、仮プロシージャー名の長さを示す場合はアスタリスクになります。内部関数、モジュール関数、または再帰的関数の場合、または関数が配列またはポインティング値を返す場合、長さにアスタリスクを使うことはできません。
CHARACTER(KIND=1,LEN=6) APPLES /'APPLES'/ CHARACTER*7, TARGET :: ORANGES = 'ORANGES' CALL TEST(APPLES) END SUBROUTINE TEST(VARBL) CHARACTER*(*), OPTIONAL :: VARBL ! VARBL inherits a length of 6 COMPLEX, DIMENSION (2,3) :: ABC(3) ! ABC has 3 (not 6) array elements REAL, POINTER :: XCONST TYPE PEOPLE ! Defining derived type PEOPLE INTEGER AGE CHARACTER*20 NAME END TYPE PEOPLE TYPE(PEOPLE) :: SMITH = PEOPLE(25,'John Smith') END
関連情報