目的
CHARACTER 型宣言ステートメントは文字型の オブジェクトと関数の種類、長さ、および属性を指定します。 オブジェクトには初期値を割り当てることができます。
構文
>>-CHARACTER--+---------------+--+-----------------------+------> '-char_selector-' +-::--------------------+ '-,--attr_spec_list--::-' >--entity_decl_list-------------------------------------------->< |
それぞれの意味は次のとおりです。
attr_spec |
---|
ALLOCATABLE AUTOMATIC BIND DIMENSION (array_spec) EXTERNAL INTENT (intent_spec) INTRINSIC OPTIONAL PARAMETER POINTER PRIVATE PROTECTED PUBLIC SAVE STATIC TARGET VALUE VOLATILE |
文字長を指定します。
>>-+-(--+-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--+---+---------------------------------------------' '-,-' |
>>-a--+-+------------------+--+------------------+-+------------> | '- * --char_length-' '-(--array_spec--)-' | '-(--array_spec--)-- * --char_length---------' >--+-----------------------------------+----------------------->< | (1) | '-+-/--initial_value_list--/------+-' +- = --initialization_expr------+ | (2) | '- => --NULL()------------------'
注:
|
+----------------------------------IBM 拡張----------------------------------+
+------------------------------End of IBM 拡張-------------------------------+
+---------------------------------Fortran 95---------------------------------+
+-----------------------------End of Fortran 95------------------------------+
規則
+---------------------------------Fortran 95---------------------------------+
派生型の定義について、以下のことが該当します。
変数に => を指定する場合、 オブジェクトに POINTER 属性を指定しなければなりません。
+-----------------------------End of Fortran 95------------------------------+
変数に initialization_expr を指定する場合、 オブジェクトに POINTER 属性を指定できません。
型宣言ステートメント中のエンティティーは、 エンティティーに対して指定された属性の規則によって制限されます。 詳細は対応する属性ステートメントを参照してください。
型宣言ステートメントは、事実上暗黙の型の規則をオーバーライドします。 組み込み関数の型を確認する型宣言ステートメントを 使用することができます。型 宣言ステートメントの中に組み込み関数の総称名または特定名が 使用されていても、その名前は組み込み関数の特性を失うことはありません。
オブジェクトが仮引き数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内の オブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトである場合、そのオブジェクトを 型宣言ステートメントの中で最初に定義してはいけません。 AUTOMATIC 属性を持っているオブジェクトも初期化することはできません。 以下の場合にオブジェクトを初期化できます。
+----------------------------------IBM 拡張----------------------------------+
+------------------------------End of IBM 拡張-------------------------------+
+---------------------------------Fortran 95---------------------------------+
Fortran 95 では、ポインターは初期化することができます。 ポインターを初期化するには、=> NULL() を使用する方法しか ありません。
+-----------------------------End of Fortran 95------------------------------+
インターフェース本体、あるいはサブプログラムの指定部分に宣言式 がある場合、array_spec または type_param_value の 宣言式を非定数式にすることができます。 この非定数式を使用する宣言オブジェクトのうち、仮引き数または ポインティング先でないものを自動オブジェクト といいます。
1 つの属性を 1 つの型宣言ステートメントの中で繰り返すことはできません。 また、1 つの有効範囲単位内でエンティティーに同じ属性を明示的に複数回与えることもできません。
ステートメントが PARAMETER 属性を
持つときは、initialization_expr を指定する必要があります。initialization_expr
または
NULL()
が指定されている場合、エンティティーの宣言によって次のようになります。
+---------------------------------Fortran 95---------------------------------+
+-----------------------------End of Fortran 95------------------------------+
変数または変数サブオブジェクトを複数回初期化することはできません。a が
変数で、initialization_expr
または NULL()
が
ある場合、a が保管済みオブジェクト (名前付き共通ブロック内のオブジェクトを除く)
であることを意味します。オブジェクトの初期化はオブジェクトの基本的なストレージ・クラスに影響を与える場合もあります。
entity_decl の中で指定されている array_spec は、DIMENSION 属性の 中で指定されている array_spec より優先します。 entity_decl の中で指定されている char_length は、 char_selector で指定されているどの長さよりも優先します。
POINTER 属性を持たない配列関数の結果は、 明示的形状配列の仕様を持つものでなければなりません。
宣言されたエンティティーが関数の場合、アクセス可能な明示インターフェース を持つことはできません。組み込み関数の場合は、この限りではありません。
+----------------------------------IBM 拡張----------------------------------+
事前に定数の名前として定義されている T または F が型 宣言ステートメントにある場合、それは省略された論理定数ではなく 名前付き定数の名前になります。
+------------------------------End of IBM 拡張-------------------------------+
ステートメント内にダブル・コロン・セパレーター (::) がない場合にのみ、CHARACTER 型宣言ステートメントの char_length の後にオプションのコンマを入れることができます。
CHARACTER 型宣言ステートメントがモジュール、ブロック・データ・プログラム単位、またはメインプログラムの 有効範囲にあり、エンティティーの長さを継承されるものとして指定する場合、そのエンティティーは名前付き文字定数の名前で なければなりません。 文字定数は PARAMETER 属性に定義される対応する式の長さになります。
CHARACTER 型宣言ステートメントがプロシージャーの 有効範囲にあり、エンティティーの長さが継承される場合、 そのエンティティーの名前は仮引き数または名前付き文字定数の名前で なければなりません。 ステートメントが外部関数の有効範囲にある場合、そのステートメントを 同じプログラム単位内の FUNCTION または ENTRY ステートメント内の関数名または入り口名にすることができます。 エンティティー名が仮引き数の名前の場合、 仮引き数はプロシージャーを参照するために、 関連する実際の引き数の長さを受け入れます。 エンティティー名が文字定数の名前と同じ場合、文字定数 は PARAMETER 属性が定義する対応した式の長さを受け入れます。 エンティティー名が関数名または入り口名と同じ場合、 エンティティーは呼び出し側の有効範囲単位内で指定されている長さを受け入れます。
文字関数の長さは、関数の型がインターフェース・ブロックで宣言されて いない場合は定数式でなければならない宣言式になり、ダミー・プロシージャー名の長さを示す場合はアスタリスクになります。 内部関数、モジュール関数、または再帰的関数の場合、または関数が 配列またはポインティング値を返す場合、長さにアスタリスクを使う ことはできません。
例
CHARACTER(KIND=1,LEN=6) APPLES /'APPLES'/ CHARACTER(7), TARGET :: ORANGES = 'ORANGES' I=7 CALL TEST(APPLES,I) CONTAINS SUBROUTINE TEST(VARBL,I) CHARACTER*(*), OPTIONAL :: VARBL ! VARBL inherits a length of 6 CHARACTER(I) :: RUNTIME ! Automatic object with length of 7 END SUBROUTINE END
関連情報