Derived Type (構造型)

:ユーザー定義型の名前と,その成分の型を宣言します。

形式

TYPE [ [, access] :: ] name

component-definition
[component-definition] ...
END TYPE [name]

access
PRIVATE または PUBLIC キーワード。キーワードを宣言できるのは,構造型定義がモジュール宣言部に含まれている場合だけです。

name
構造型の名前。組込み型の名前と同じであってはならず,モジュールから参照できる構造型の名前と同じであってもなりません。

component-definition
構造型の成分を定義する 1 つまたは複数の型宣言文。

最初の成分定義の前に,省略可能な PRIVATE または SEQUENCE 文を付けることができます (1 つの構造型定義には,PRIVATE または SEQUENCE 文を 1 つしか使用することができません)。

PRIVATE は,構造型そのものが公開であっても,構造型を定義しているモジュールの中からしか成分に参照できないことを宣言します。

SEQUENCE を宣言すると,構造型の成分は,型定義に宣言されているのと同じ順序で格納されます。SEQUENCE が宣言されている場合,成分定義に宣言されているすべての構造型が SEQUENCE 型でなくてはなりません。

component-definition は次の形式を取ります。

type [[,attr]::]component[(a-spec)][*char-len][init-ex]

type
型指定子。これは組込み型か,事前に定義された構造型のどちらかです (この指定子の後に POINTER 属性が続いている場合,type として,ここで定義されている型も含めて,任意の参照可能な構造型を宣言することができます)。

attr
ポインタ成分の省略可能な POINTER 属性,または配列成分の省略可能な DIMENSION 属性。片方または両方の属性を宣言することができます。DIMENSION が宣言されている場合,その後に配列宣言を続けることができます。

POINTER または DIMENSION 属性は,1 つの component-definition に 1 回しか宣言できません。

component
定義している成分の名前。

a-spec
省略可能な配列宣言を括弧で囲んだもの。POINTER が宣言されていれば,配列は形状無指定配列となり,そうでなければ,形状明示配列となります。形状明示配列の宣言では,両境界は定数のスカラ整数式でなくてはなりません。

ここで配列境界を宣言しなかった場合,DIMENSION 属性の後に宣言する必要があります。

char-len
省略可能なスカラ整定数表現。前に星印 (*) を付ける必要があります。このパラメタは,成分が文字型である場合にのみ宣言できます。

init-ex
初期値式またはポインタ成分 (=>NULL())。これは Fortran 95 の機能です。

init-ex が宣言されている場合,成分定義に二重コロン (::) が含まれていなくてはなりません。等号 (=) 代入記号は非ポインタ成分に対してしか宣言できません。

初期値式は,型定義の有効域中で評価されます。

規則と振る舞い

END TYPE 文の後に名前を宣言する場合,構造型文で TYPE の後に宣言されている名前と同じでなくてはなりません。

1 つの構造型は同じ有効域中で 1 回しか定義できません。別の有効域中の構造型定義で同じ構造型名が現れる場合,その構造型は別のものとして扱われます。

成分名は,構造型定義の有効範囲しか持ちません。このため,同じ有効域中の別の構造型定義では,同じ名前を使用することができます。

2 つのデータ言語要素が同じ型になるのは,両方が同じ構造型として宣言されている場合に限られます (構造型定義はモジュールまたは親プログラムの有効域から参照できます)。

言語要素が異なる有効域にある場合,それらが異なる構造型定義の引用を使って宣言されており,両方の構造型定義が以下のすべての条件を満たしている場合,同じ構造型を持つことができます。

互換性

CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB

関連情報

DIMENSIONMAP...END MAPPRIVATEPUBLIC, RECORDSEQUENCESTRUCTURE...END STRUCTURE暗黙的初期値指定構造型構造体構成子構造体成分

	TYPE mem_name
	  SEQUENCE
	  CHARACTER (LEN = 20) lastn
	  CHARACTER (LEN = 20) firstn
	  CHARACTER (len = 3) cos	! これは,動作します。理由は,COS が成分名だからです。
	END TYPE mem_name
	TYPE member
	    TYPE (mem_name) :: name
	    SEQUENCE
	    INTEGER age
	    CHARACTER (LEN = 20) specialty
	END TYPE member

以下の例では,ab は,両方とも構造型 pair の変数配列です。

	TYPE (pair)
	  INTEGER i, j
	END TYPE
	TYPE (pair), DIMENSION (2, 2) :: a, b(3)

以下の例は,他の構造型オブジェクトの成分として構造型オブジェクトの使い方を示しています。

	TYPE employee_name
	  CHARACTER(25) last_name
	  CHARACTER(15) first_name
	END TYPE
	TYPE employee_addr
	  CHARACTER(20) street_name
	  INTEGER(2) street_number
	  INTEGER(2) apt_number
	  CHARACTER(20) city
	  CHARACTER(2) state
	  INTEGER(4) zip
	END TYPE

これらの構造型のオブジェクトは,第 3 の構造型宣言内で利用することができます。以下のようにします。

	TYPE employee_data
	  TYPE (employee_name) :: name
	  TYPE (employee_addr) :: addr
	  INTEGER(4) telephone
	  INTEGER(2) date_of_birth
	  INTEGER(2) date_of_hire
	  INTEGER(2) social_security(3)
	  LOGICAL(2) married
	  INTEGER(2) dependents
	END TYPE