文:欄名,欄内のデータの型,および記録内での欄の順序と位置合わせを定義します。欄と構造体は初期化できますが,記録を初期化することはできません。
形式
STRUCTURE [/structure-name/] [field-namelist]
structure-name
構造体を識別するために使われる名前。斜線で囲まれます。
これ以降の RECORD 文は,この構造体名を使って構造体を引用します。構造体名はすべての構造体名中で一意でなくてはなりませんが,変数 (スカラまたは配列),記録欄,PARAMETER 定数,および共通ブロックと名前を共有することは可能です。
構造体宣言は入れ子にする (1 つまたは複数の他の構造体宣言を含む) ことができます。構造体宣言では,構造体名は一番外側の入れ子のレベルでは必須ですが,その中に入れ子になっている他の宣言では省略可能です。ただし,プログラム中の RECORD 文で入れ子にされた構造体を引用したいのであれば,その構造体は名前を持っていなくてはなりません。
構造体,欄,および記録の名前は,すべてそれを定義するプログラム単位に対して局所的です。記録が引数として渡される場合,呼び出し側の副プログラムと呼び出される側の副プログラム中でそれらの記録を定義している構造体の欄は,型,順序,および次元の点で一致していなくてはなりません。
field-namelist
結合されている構造体宣言の構造を持つ欄並び。field-namelist は,入れ子にされた構造体宣言でのみ使用することができます。
field-declaration
宣言本体とも呼ばれます。field-declaration は,以下のものの任意の組み合わせから構成されます。
これらは通常の Fortran データ型宣言です。
構造体中の欄は,核欄,他の副構造体,またはこの 2 つの組み合わせから成る副構造体であってもかまいません。
共用体宣言は,1 つまたは複数のマップされた欄宣言から構成されます。
PARAMETER 文は,構造体宣言の中に置くことはできますが,宣言ブロック中でデータ型を与えることはできません。
PARAMETER 名の型宣言は,PARAMETER 文の前にあり,STRUCTURE 宣言の外になくてはなりません。
INTEGER*4 P STRUCTURE /ABC/ PARAMETER (P=4) REAL*4 F END STRUCTURE REAL*4 A(P)
規則と振る舞い
Fortran 90 構造型は,STRUCTURE と RECORD 構文を置き換え,新しいプログラムを書く時に使用すべきです。詳細は,「構造型」と「TYPE」を参照してください。
型宣言文とは異なり,構造体宣言は変数を作成しません。構造体変数 (記録) は,以前に宣言した構造体の名前を含む RECORD 文が使用された時点で作成されます。RECORD 文は一種の型宣言文と考えることができます。両者の違いは,個々の項目ではなく集合項目が定義されるという点にあります。
構造体宣言中では,文と文中の欄名の両方の順序が重要となります。この順序は記録内の欄の順序を決定するからです。
構造体宣言中で,個々の欄オフセットは,それまでの欄の長さの和なので,構造体の長さはその欄の長さの和になります。構造体は詰め込まれます。必要な位置合わせは,たとえば適切な長さの名前なし欄を挿入することによって,明示的に指定しなくてはなりません。
基本設定では,欄は自然な境界に位置合わせされます。位置のずれた欄は必要に応じて充填されます。記録の充填を避けるには,すべての欄が自然な位置合わせになるように,構造体の構成を指定しなくてはなりません。
欄を任意のバイト境界に合わせて詰め込むためには,コンパイラ・オプションを指定する必要があります。また,cDEC$ OPTIONS または cDEC$ PACK 一般指示文を使って,欄の位置合わせを指定することも可能です。
欄名は,組込み演算子またはユーザー定義演算子と同じであってはなりません (たとえば,EQ を欄名として使用することはできません)。
互換性
CONSOLE STANDARD GRAPHICS QUICKWIN GRAPHICS WINDOWS DLL LIB
関連情報
MAP...END MAP,PACK 指示文,OPTIONS 指示文,RECORD,TYPE,UNION...END UNION,記録構造体,構造型,データ型,定数,および変数
例
項目は,前に定義した構造体型を引用する RECORD 文です。
STRUCTURE /full_address/ RECORD /full_name/ personsname RECORD /address/ ship_to INTEGER*1 age INTEGER*4 phone END STRUCTURE
ピリオド (.) で区切って項目に到達するために必要な一連の項目を並べて特定の項目を指定することができます。以前の例で定義した full_address 構造体を使い,構造体変数 shippingaddress を宣言すると仮定します。
RECORD /full_address/ shippingaddress
この場合,age 項目は,shippingaddress.age で指定されます。受領者の名前は shippingaddress.personsname.first_name で指定されます。
次の例の宣言は,APPOINTMENT という名前の構造体を定義しています。APPOINTMENT は,副構造体として構造体 DATE (欄 APP_DATE) を含んでいます。これはまた,TIME という名前の副構造体 (欄 APP_TIME 配列),APP_MEMO という名前の CHARACTER*20 配列,および APP_FLAG という名前の LOGICAL*1 欄も含んでいます。
STRUCTURE /DATE/ INTEGER*1 DAY, MONTH INTEGER*2 YEAR END STRUCTURE STRUCTURE /APPOINTMENT/ RECORD /DATE/ APP_DATE STRUCTURE /TIME/ APP_TIME (2) INTEGER*1 HOUR, MINUTE END STRUCTURE CHARACTER*20 APP_MEMO (4) LOGICAL*1 APP_FLAG END STRUCTURE
構造体 APPOINTMENT のすべてのインスタンスの長さは 89 バイトです。
次図に,構造体 APPOINTMENT の記録または記録配列要素のメモリー・マッピングを示します。
構造体 APPOINTMENT のメモリー・マップ