記録欄の引用は,引用される欄の種類に対応していなくてはなりません。集合欄引用は,複合構造体 (および副構造体) を引用します。スカラ欄引用は,変数などの単一データ項目を引用します。
記録に対する演算では,1 つまたは複数の欄を扱うことができます。
記録欄引用は,以下のいずれかの形式を取ります。
集合欄引用
record-name [.aggregate-field-name] ...
スカラ欄引用
record-name [.aggregate-field-name] ... .scalar-field-name
record-name
RECORD 文の中で記録を識別するために使用される名前。
aggregate-field-name
記録名によって識別される記録構造体中の副構造体 (記録,または入れ子にされた構造体宣言) の欄の名前。
scalar-field-name
構造体宣言中で定義されている (データ型を持つ) データ項目の名前。
規則と振る舞い
記録と記録欄は,EQUIVALENCE 文中で使用することはできません。ただし,構造体宣言で UNION および MAP 文を使用することで,記録構造体の欄を自分自身と等価にすることができます。
記録と記録欄は DATA 文では使用できませんが,STRUCTURE 定義中で個々の欄を初期化することはできます。
自動割付け配列は記録欄であってはなりません。
スカラ欄引用は,(RECORD 文で指定されている) 記録の名前と,ゼロ個以上のレベルの集合欄名の後に,スカラ欄の名前を続けたものから構成されます。スカラ欄引用は,(データ型を持つ) 1 つのデータ項目を引用し,Fortran 変数または配列要素の通常の引用のように扱うことができます。
スカラ欄引用は,文関数と実行文で使用することができます。ただし,COMMON,SAVE,NAMELIST,または EQUIVALENCE 文で使用したり,索引付き DO ループの制御変数として使用したりすることはできません。
スカラ欄引用の型変換規則は,変数と配列要素の規則と同じです。
集合欄引用は,(RECORD 文で指定されている) 記録の名前と,ゼロ個以上のレベルの集合欄名から構成されます。
記録が同じ構造を持つ場合、集合欄を別の集合欄に代入する (record = record) ことは可能です。Compaq Fortran は,集合欄に対しては,これ以外の演算 (算術や比較など) はサポートしていません。
Compaq Fortran では,すべてのレベルで修飾が必要です。一部の言語では,どの欄が対象となっているかが曖昧でない場合,集合欄名を省略することができますが,Compaq Fortran ではすべての集合欄名を引用に含める必要があります。
集合欄引用は書式なし I/O 文で使用することができます。I/O 並びにどれだけの集合および配列名引用が含まれていても,I/O 記録は 1 つだけ書き込まれます。書式付き,変数群,および並び指定 I/O 文では,集合欄引用は使用できません。
集合欄引用は,実引数と記録仮引数として使用することができます。副プログラム中の仮記録の宣言は,呼び出し側プログラム単位が渡す集合欄引用の形式と一致していなくてはなりません。個々の構造体は,同じ数と型の欄を同じ順序で持っていなくてはなりません。共用体宣言中のマップ欄の順序は関係しません。
記録は引用によって渡されます。集合欄引用は通常の変数のように扱われます。RECORD 文では,仮引数として使われる調節可能配列を使用することができます。
例
以下の例は,記録および欄引用を示しています。次の構造体宣言を考えます。
構造体 DATE
STRUCTURE /DATE/ INTEGER*1 DAY, MONTH INTEGER*2 YEAR END STRUCTURE
構造体 APPOINTMENT
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
次の RECORD 文は,NEXT_APP という名前の変数と,APP_LIST という名前の 10 個の要素を持つ配列を作成します。変数と,配列の個々の要素は,どちらも構造体 APPOINTMENT の書式を取ります。
RECORD /APPOINTMENT/ NEXT_APP,APP_LIST(10)
以下の記録および欄引用の例は,上の構造体宣言と RECORD 文をもとにしています。
集合欄引用
NEXT_APP
APP_LIST(3).APP_DATE
スカラ欄引用
NEXT_APP.APP_FLAG
NEXT_APP.APP_MEMO(1)(1:1)
関連情報