| FORTRAN 77 言語リファレンス |
第 4 章
文
この章では Sun WorkShop FORTRAN 77 コンパイラ
f77の文について説明しています。規格外の文はシンボル記号 (©) で示しています。(規格準拠の詳細については、第 1 章を参照してください。) 文の例は、付録 B「文の例」を参照してください。
ACCEPT構文
ACCEPT© 文は標準入力から読み取り、以下の構文を使用します。
ACCEPTgrname
パラメータ 説明 f 書式識別子 iolist 変数、部分列、配列、および記録の並び grname 変数群の名前
説明
ACCEPTf [,iolist] 文はREADf [,iolist] に相当し、Fortran 77 の旧バージョンとの互換用に提供されています。
REAL VECTOR(10)ACCEPT *, NODE, VECTOR
ASSIGN
ASSIGNsTOi
パラメータ 説明 s 文番号 i 整変数
説明
文番号は、 ASSIGN 文と同じプログラム単位内に定義されている文の文番号でなければなりません。
整数の変数 i には、一度文番号を代入した後、同じ文の番号、異なる文の番号、整数のいずれかを再代入することができます。ただし、
制限事項INTEGER*2で宣言することはできません。
変数を割り当て型
GOTO文の文番号、または書式識別子として引用するには、その前に変数に文番号を代入しなければなりません。i に文番号値を代入しているときは、i で演算を行ってはいけません。
64 ビット プラットフォームでは、
例ASSIGN文によって変数 i に格納された実数値はプログラムで使用できません。ただし、割り当て型GOTO文中で使用する場合、または入出力文中で書式識別子として使用する場合は除きます。さらに、割り当て型GOTO文の中、または書式識別子として使用できる変数は、ASSIGN文によって指定された変数に限ります。
例 1 : 実行文の文番号を代入
IF(LB.EQ.0) ASSIGN 9 TO K...GO TO K...9 AKX = 0.0
例 2 :FORMAT文の文番号を代入
INTEGER PHORMAT2 FORMAT ( A80 )ASSIGN 2 TO PHORMAT...WRITE ( *, PHORMAT ) 'FORMAT 文の文番号が割り当てられました。'
代入
代入文は値を変数、部分列、配列要素、記録、または記録欄に代入します。
パラメータ 説明 v 変数、部分列、配列要素、記録、または記録欄 e 代入値を与える式
説明
値は定数または式の結果です。代入文の種類には算術代入、論理代入、文字代入、および記録代入があります。
算術代入
v は数値型であり、変数、配列要素、または記録欄の名前です。
e は算術式、文字定数、または論理式です。論理値を数値として代入することは規格外のため移植できない場合があります。結果のデータ型は v のデータ型になります。©
算術代入文を実行すると、式 e が評価され、(型が異なる場合) v の型へ変換され、v に代入されます。結果の値の型は下表に従って決まります。
注 - オプション-i2、-dbl、-r8、または-xtypemapのいずれかを指定してコンパイルした場合、変数と式のデフォルトのデータサイズが変更されることがあります。これについては第 2 章「データ型とデータ項目」を参照してください。これらのオプションについては、『Fortran ユーザーズガイド』も参照してください。
REAL A, BDOUBLE PRECISION VV = A * B
REAL A, BDOUBLE PRECISION VV = DBLE( A * B )論理代入
e は論理式、-128 と 127 の間の整数、または単一の文字定数です。
論理代入文を実行すると、論理式 e が評価され、結果の値が v に代入されます。e が
(-128 と 127 の間の整数または単一の文字定数ではなく) 論理式の場合、e は真か偽のどちらかの値を持ちます。任意のサイズの論理式を任意のサイズの論理変数に代入できます。
LOGICAL文に関する節で、論理変数のサイズについてさらに詳しく述べます。文字代入
この定数はホレリス定数またはアポストロフィ (') か引用符 (") で区切られた文字列です。文字列には制御文字の Control-A、Control-B、Control-C を含むことはできません。すなわち、Control キーを押しながら、A、B、C のキーを押すことはできません。これらの制御文字を必要とする場合は、関数
CHAR()を使用してください。引用符を使用して文字定数を区切ると、
-xlオプションを指定してコンパイルすることができません。この場合の引用符は 8 進定数を意味するからです。文字は変換されずに変数に移されます。これは移植できない場合があります。演算子 // を含む文字式は
CHARACTER型の項目にだけ代入できます。ここで v はCHARACTER型で、変数、部分列、配列要素、または記録欄の名前です。e は文字式です。文字代入文を実行すると、文字式が評価され、結果の値が v に代入されます。e の長さが v の長さより長い場合、右側の文字が切り捨てられます。e の長さが v の長さより短かければ、空白文字が右側に詰められます。
記録代入
e と v は同じ構造体である必要があります。以下の場合は同じ構造体です。
- e と v が同じ要素データ型を持つ欄である。
- e と v が同じ数の欄を持つ記録で、対応する欄が同じ要素データ型である。
- e と v が同じ数の欄を持つ記録で、対応する欄が上記で定義されたもの (同じ要素データ型であること) と同じ構造体を持つ部分構造体である。
例 1 : 算術代入
RECORD文とSTRUCTURE文に関する節で、記録の構造についてさらに詳しく述べます。
例 2 : 論理代入
LOGICAL B1*1, B2*1LOGICAL L3, L4L4 = .TRUE.B1 = L4B2 = B1
例 3 : ホレリス代入
CHARACTER S*4INTEGER I2*2, I4*4REAL RS = 4HwxyzI2 = 2HyzI4 = 4HwxyzR = 4Hwxyz
例 4 : 文字代入
CHARACTER BELL*1, C2*2, C3*3, C5*5, C6*6REAL ZC2 = 'z'C3 = 'uvwxyz'C5 = 'vwxyz'C5(1:2) = 'AB'C6 = C5 // C2BELL = CHAR(7) 制御文字 (^G)
例 5 : 記録代入と記録欄代入
C2 は、'zD'後続に空白がありますC3 は、'uvw'C5 は、'ABxyz'C6 は、'ABxyzz'C5 の左側に余分の z がありますBELLは、16 進の 07Control-G、ベルです
AUTOMATIC
AUTOMATIC© 文を使用すると、副プログラムが再帰的に呼び出されるごとに各指定項目のコピーが確実に行われます。また、この文を使用すると、副プログラムが
RETURN文で終了する場合に、副プログラムの外で指定項目が確実に未定義になります。
AUTOMATICvlist
vlist 変数および配列の並び
説明
自動変数を使用すると、手続きの呼び出しごとに 1 つコピーが行われます。呼び出したときに局所変数が未定義になるのを避けるために、
f77はすべての局所変数をデフォルトで静的に定義すると共に、あらゆる変数を静的か自動のどちらかに分類します。STATIC© 文、AUTOMATIC© 文、またはIMPLICIT文で明示的に変数を静的または自動に定義することもできます。『Fortran ユーザーズガイド』の第 3 章「式」にある-stackvarオプションも参照してください。
AUTOMATICの使用法として、関数のスタート時にすべての自動変数を宣言することができます。
INTEGER FUNCTION NFCTRL( I )IMPLICIT AUTOMATIC (A-Z)...RETURNEND局所変数および局所配列はデフォルトでは静的になるため、一般に
制限事項SAVEを使用する必要はありませんが、SAVEを使用することにより移植性を確実にすることができます。また、RETURN以外の方法により副プログラムを終了する場合にもSAVEを使用すると安全です。
自動変数と自動配列は、
DATAまたはSAVE文では使用できません。また、引数と関数値は
例f77によって常に自動にされるため、DATA、RECORD、STATIC、SAVE文では使用できません。
例:AUTOMATICのその他の使用例を示します。
AUTOMATIC A, B, CREAL P, D, QAUTOMATIC P, D, QIMPLICIT AUTOMATIC (X-Z)例 :
AUTOMATICの場合、構造体の動作は予測できません。
AUTOMATIC文と型宣言文を結合してAUTOMATIC型宣言文を作ることはできません。たとえば、
AUTOMATIC REAL Xでは、変数XがAUTOMATICとREALであると宣言しているのではなく、変数REALXがAUTOMATICであると宣言しています。
BACKSPACE
BACKSPACE文は先行する記録の直前に指定ファイルを位置付けます。
BACKSPACE( [UNIT= ]u[, IOSTAT=ios] [, ERR=s] )
パラメータ 説明 u ファイルに結合された外部装置の装置識別子 ios 入出力状態指定子、整変数、または整数の配列要素 s 誤り指定子:s は、BACKSPACE 文が使用されているプログラム単位内にある実行文の文番号であること。BACKSPACE 文の実行中にエラーが生じるとプログラムの制御はこの文番号に移される。
説明
u は順番探査に結合する必要があります。直接探査ファイルにおける
BACKSPACE文の実行は FORTRAN 77 規格では定義されておらず、どのようになるか保証できません。直接探査ファイル、または追加探査ファイルにおいてBACKSPACE文を使用することは好ましくありません。FORM='BINARY'として開いたファイルに対してはBACKSPACEは指定できず、実行時にエラーとなります。
BACKSPACE文を実行すると、ファイル位置が次のように変更されます。
実行前 実行後 ファイルの始め
そのまま
ファイル終了記録の後
ファイル終了記録の前
直前の記録の始め
同じ記録の開始位置
例
例 1 : 簡単なバックスペース
BACKSPACE 2LUNIT = 2BACKSPACE LUNIT
例 2 : エラートラップを伴うバックスペース
INTEGER CODEBACKSPACE ( 2, IOSTAT=CODE, ERR=9 )...9 WRITE (*,*) 'BACKSPACE 中にエラー'STOP
BLOCK DATA
BLOCKDATA文は、名前付き共通ブロック内の変数と配列を初期化する副プログラムを識別します。
パラメータ 説明 name BLOCK DATA文が使用される初期値設定副プログラムの英字名。
このパラメータは省略可能。これは大域名。BLOCK DATA[ name ] 説明
初期値設定副プログラムには、複数の名前付き共通ブロックの複数のデータの初期値を含むことができます。
BLOCK DATA文は初期値設定副プログラムの最初の文でなければなりません。名前付き共通ブロックに定義された項目だけが初期値設定副プログラムで初期設定できます。
名前付き共通ブロックの 1 つの項目を初期設定すると、その共通ブロック内に記憶単位を持つすべての項目は、初期設定していなくても COMMON 文で宣言する必要があります。
制限事項
実行可能プログラムでは、名前なし初期値設定副プログラムを 1 つしか使用できません。
同じ名前付き共通ブロックは、同じ実行可能プログラムの 2 つ以上の初期値設定副プログラムに指定することはできません。
省略可能なパラメータの名前は同じ実行可能プログラムの外部手続き、主プログラム、共通ブロック、または他の初期値設定副プログラムの名前と同じであってはなりません。名前は副プログラムの局所名と同じであってはなりません。
例
BLOCK DATA INITCOMMON /RANGE/ X0, X1DATA X0, X1 / 2.0, 6.0 /END
BYTE
BYTE© 文は型が 1 バイトの整数であることを指定します。配列次元を指定したり、初期値を与えたりすることもできます。
BYTEv [/c/] ...
パラメータ 説明 v 定数名、変数、配列、配列宣言子、関数、または仮関数のどれかの名前 c 直前の名前に対する定数の並び
説明
これは
例LOGICAL*1と同義です。BYTE型の項目は論理値の .TRUE.、.FALSE.、1 つの 8 ビットデータ項目、または-128 と 127 の間の整数を持つことができます。
BYTE BIT3 /8/, C1/'W'/, M/127/, SWITCH/.FALSE./
CALL
CALL文は指定サブルーチンに分岐し、そのサブルーチンを実行し、終了した後、呼び出し元のプログラムへ戻ります。
CALLsub [ ( [ ar [, ar ] ... ] ) ]
パラメータ 説明 sub 呼び出されるサブルーチンの名前 ar サブルーチンに引き渡す実引数
説明
FORTRAN 77 規格では
CALL文における実引数の順序、数値、型が、引用されるサブルーチンの対応する仮引数と一致することを必要とします。-XlistEオプションを設定した場合のみ、コンパイラはこれをチェックします。再帰は許可されます。副プログラムがそれ自体を直接呼び出すか、またはこのサブルーチンを続いて呼び出す別の副プログラムを呼び出すことにより、間接的に呼び出すことができます。このような再帰は規格外です。©
- 式
- 引数として渡されることが許可された組み込み関数。
実引数として引き渡すことができない組み込み関数については、表 4-2 を参照してください。- サブルーチン名
- 文番号があとに続く選択戻り指定子の
*または&。&は規格外です。©最も基本的な式、および最も多く使用される式には次のようなものがあります。
サブルーチンに引数がない場合、そのサブルーチンを引用する
CALL文に実引数があってはなりません。空の引数をサブルーチン名の後に続けることができます。1. すべての式 (引数) が評価されます。2. すべての実引数が対応する仮引数に関連付けられ、サブルーチンの本体が実行されます。3. 通常、RETURNまたはEND文をサブルーチンで実行するとき、制御はCALL文の後の文に移されます。RETURNn という形式による選択戻りが実行されると、制御はCALL文の n という選択戻り指定子により指定された文へ移されます。
注 -SUBROUTINEとしてでなくFUNCTIONとして定義された副プログラムに対してCALL文を使用すると、予測できない結果になる可能性があるので、使用しないでください。このように不適切なCALL文があっても、警告メッセージは表示されません。
例
例 1 : 文字列
CHARACTER *25 TEXTTEXT = 'Some kind of text string'CALL OOPS ( TEXT )SUBROUTINE OOPS ( S )CHARACTER S*(*)WRITE (*,*) SEND
例 2 : 選択戻り
例 3 : 選択戻りの別の形式。&は規格外。©
CALL RANK ( N, &8, &9 )
例 4 : 配列、配列要素、および変数。
REAL M(100,100), Q(2,2), YCALL SBRX ( M, Q(1,2), Y )...ENDSUBROUTINE SBRX ( A, D, E )REAL A(100,100), D, E...RETURNEND
この例では、実数配列
例 5 : 構造体の記録と欄。記録は規格外。©Mは実数配列Aに対応し、実数配列要素Q(1,2)は実数変数Dに対応します。
上記の例では、記録
NEWは記録CURRENTに、整数の変数Kは記録欄PRIOR.OLDに対応します。
CHARACTER
CHARACTER文は定数名、変数、配列、関数、および仮関数の型が文字であることを指定します。
CHARACTER[* len [,]] v [* len /c/]] ...
v 定数名、変数、配列、配列宣言子、関数、仮関数の名前 len 定数名、変数、配列要素、および関数の文字における長さ c 直前の名前に対する定数の並び
説明
それぞれの文字は文字境界に整列した 8 ビットの記憶領域を占有します。文字変数を含む共通ブロックと文字配列は文字変数の 1 つの集合に組み込まれています。ある要素の最初の文字は先行要素の最後の文字に隙間なしに続きます。
長さ len は 0 より大きくなければなりません。len を省略すると、1 に等しいとみなされます。
局所文字変数、共通文字変数、定数名、仮引数、または関数名の場合は、len は整定数または括弧で囲まれた整数の定数式です。
仮引数または関数名の場合、len は別の形式を持つこともあります。この形式は括弧で囲まれたアスタリスク、すなわち CHARACTER*(*) です。この形式は、関数名の長さはプログラム単位の参照によって定義され、仮引数が実引数の長さを持つことを意味します。
定数名の場合、len は括弧で囲まれたアスタリスクでもよく、これは名前がその定数の長さを持つものとして定義されていることを示します。これは後述の例 5 で示します。
定数の並び c は変数、配列、または配列宣言子に対してだけ使用できます。直前の変数に対して 1 つだけと、直前の配列の各要素に対して 1 つずつ定数が許可されます。
例
例 1 : 文字列と文字列の配列
CHARACTER*17 A, B(3,4), V(9)CHARACTER*(6+3) C
CHARACTER A*17, B(3,4)*17, V(9)*17CHARACTER C*(6+3)
CHARACTER A*17, B*17(3,4), V*17(9) 非標準空文字列 (長さがゼロ) の変数は存在しません。空文字を代入された 1 バイトの文字列の長さは 1 です。
例 2 : 空文字列の変数は存在しません。
CHARACTER S*1S = ''
代入文の実行中、変数
例 3 : 固定長の仮引数文字列Sはあらかじめ消去されて空白になり、0 個の文字がSに移されるので、Sは空白を 1 つ含みます。宣言により、LEN(S)は1という長さを戻します。1 より小さいサイズを宣言することはできないので、これは最も短い文字列変数になります。
SUBROUTINE SWAN ( A )CHARACTER A*32
例 4 : 対応する実引数と同じ長さを持つ仮引数文字列
SUBROUTINE SWAN ( A )CHARACTER A*(*)...
例 5 : 括弧に囲まれたアスタリスクを持つ定数名
CHARACTER *(*) INODEPARAMETER ( INODE = '警告: INODE が破壊されています !' )...
組み込み関数
例 6 : 組み込み関数LEN(INODE)は、文字列の実際に宣言された長さを返します。この関数は主に仮引数CHAR*(*)と一緒に使用されます。LEN
CHARACTER A*17A = "xyz"PRINT *, LEN( A )END
CLOSE
CLOSE( [UNIT=]u[, STATUS=sta] [, IOSTAT=ios]
説明
磁気テープを使用する場合
は、TOPEN()ルーチンを使用する方が確実です。
DISP=とDISPOSE=オプションはSTATUS=に対する代替として許可されていますが、-ansiフラグが設定されていると警告が出されます。1. 指定された装置が切り離されます。2. sta がDELETEであれば、指定された装置に結合されたファイルが削除されます。3. 引数注釈IOSTATを指定すると、エラーが発生しなければ、ios はゼロに、そうでない場合は正の値に設定されます。
開いているすべてのファイルは、通常のプログラム終了時にデフォルトの sta で閉じられます。指定された sta に関係なく、一時ファイルは閉じられると常に削除されます。
存在しない装置、またはファイルが結合されていない装置を指定する
CLOSE文を実行しても無効です。装置にゼロを指定した
CLOSE文 (規格ではエラーになる) の実行は許可されませんが、装置を他のファイルとして再び開くことができます。
CLOSE文の実行により切り離された装置/ファイルは、同じファイル/装置または異なるファイル/装置に再度結合できます。
注 - テープ入出力の場合、TOPEN()ルーチンを使用します。
例
例 1 : 閉じて保持する
CLOSE ( 2, STATUS='KEEP')
例 2 : 閉じて削除する
CLOSE ( 2, STATUS='DELETE', IOSTAT=I )
例 3 :STATUSがSCRATCHであっても、一時ファイルを閉じ残す
OPEN ( 2, STATUS='SCRATCH')...CLOSE ( 2, STATUS='KEEP', IOSTAT=I )
COMMON
COMMON文は主記憶領域のブロックを定義して、異なるプログラム単位が引数を使用しないで同一データを共有できるようにします。
COMMON [/[cb]/]nlist[[,]/[cb] /nlist] ...
パラメータ 説明 cb 共通ブロック名 nlist 変数名、配列名、および配列宣言子の並び
説明
無名共通ブロックを含め、どの共通ブロック名も同じプログラム単位内の
COMMON文に複数指定することができます。同一共通ブロック名に続く並び nlist は、その共通ブロック名への並びの連続として扱われます。共通ブロックの大きさは共通ブロックのすべての構成要素の大きさと整列に要するスペースの合計です。
1 つのプログラム内では、異なるプログラム単位内の同一の名前を持つ共通ブロックはすべて同一の大きさでなければなりません。ただし、無名共通ブロックは同じ大きさでなくても構いません。
制限事項
仮引数名と関数名は
COMMON文に指定することはできません。
EQUIVALENCE文は、同一プログラム単位内の 2 つの異なる共通ブロックの一連の要素を関連付けないでください。例 2 を参照してください。例
EQUIVALENCE文は共通ブロックを左側に拡張しないでください。例 4 を参照してください。
例 1 : 無名共通ブロックと名前付き共通ブロック
DIMENSION V(100)COMMON V, MCOMMON / LIMITS / I, J...
上記において
例 2 : 同一プログラム単位内の 2 つの異なる共通ブロックの要素を関連付けることはできません。VとMは無名共通ブロックにあります。一方、IとJは名前付き共通ブロックLIMITS内で定義されています。
COMMON /X/ ACOMMON /Y/ BEQUIVALENCE ( A, B) できない
例 3 :EQUIVALENCE文は共通ブロックを右側に拡張することができます。
DIMENSION A(5)COMMON /X/ BEQUIVALENCE ( B, A)
例 4 :EQUIVALENCE文は共通ブロックを左側に拡張しないでください。
COMMON /X/ AREAL B(2)EQUIVALENCE ( A, B(2)) できない
COMPLEX
COMPLEX文は、定数名、変数、配列、関数、または仮関数の型を複素数として指定し、また配列の次元と大きさを指定し、初期値を与えることもできます。
COMPLEX [*len[,]]v[*len[/c/]] [,v[*len[/c/]] ...
パラメータ 説明 v 定数名、変数、配列、配列宣言子、関数、仮関数の名前 len 定数名、変数、配列要素、または関数のバイト単位の長さで、8、16、または 32 (32 は SPARC のみ) c 直前にくる名前の定数の並び
説明
宣言は、COMPLEX、COMPLEX*8、COMPLEX*16、COMPLEX*32のいずれかです。サイズの指定は規格外となります。©
COMPLEX
COMPLEX Wのように宣言すると、変数Wは通常メモリー内で隣接した 2 つのREAL*4要素で、複素数と解釈されます。
COMPLEX Wなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
COMPLEX*8©
COMPLEX*8 Wのように宣言すると、変数Wはメモリー内で隣接した 2 つのREAL*4要素で、複素数と解釈されます。
COMPLEX*16©
COMPLEX*16 Wのように宣言すると、Wはメモリー内で隣接した 2 つのREAL*8要素で、倍長の複素数と解釈されます。
COMPLEX*32©注釈
(SPARC のみ) COMPLEX*32 Wのように宣言すると、変数Wはメモリー内で隣接した 2 つのREAL*16要素で、4 倍長の複素数と解釈されます。
各複素組み込み関数には倍精度複素数用のものがあります。一般に、その関数名は
Cの代わりにZまたはCDで始まります。2 つの関数DIMAGとDREALは例外で、実数値を返します。4 倍精度用の特定の複素関数があります (SPARC のみ)。一般に、特定の
例REALと、これに対応するC接頭辞の付いたCOMPLEX、CD接頭辞の付いたCOMPLEX DOUBLEがあります。さらにCQ接頭辞の付いた 4 倍精度COMPLEX関数もあります。たとえば、SIN()、CSIN()、CDSIN()、CQSIN()など。
例 1 : 複素変数。以下の文は等価です。
COMPLEX U, VCOMPLEX*8 U, VCOMPLEX U*8, V*8
例 2 : 複素変数の初期化
COMPLEX U / (1, 9.0) /, V / (4.0, 5 ) /
複素定数が整数または実数のどちらかの数字の対であることに注意してください。
例 3 : 倍精度複素定数、初期化
COMPLEX U*16 / (1.0D0, 9 ) /, V*16 / (4.0, 5.0D0) /COMPLEX*16 X / (1.0D0, 9.0) /, Y / (4.0D0, 5 ) /
倍精度複素定数が数字の対であり、少なくとも一方の数字が倍精度でなければならないので注意してください。
例 4 : 4 倍精度複素定数、初期化 (SPARC のみ)
COMPLEX U*32 / (1.0Q0, 9 ) /, V*32 / (4.0, 5.0Q0) /COMPLEX*32 X / (1.0Q0, 9.0) /, Y / (4.0Q0, 5 ) /
4 倍精度複素定数が数字の対であり、少なくとも一方の数字が 4 倍精度でなければならないので注意してください。
例 5 : 複素数配列。次のすべての文は規格外です (SPARC のみ)。©
COMPLEX R*16(5), S(5)*16COMPLEX U*32(5), V(5)*32COMPLEX X*8(5), Y(5)*8
CONTINUE
CONTINUE文は何も行わない文です。(SPARC のみ)
パラメータ 説明 label 文番号
説明
CONTINUE文は文番号を付ける場所として使用されることが多く、通常DOループの終わりにあります。
CONTINUE文は文番号を付けるのに便利なので、特にDOループの終了文として使用されます。CONTINUE文は、何も実行しません。例
CONTINUE文がDOループの終了文として使用される場合、実行される次の文はDOループの出口の条件によって決まります。
DIMENSION U(100)S = 0.0DO 1 J = 1, 100S = S + U(J)IF ( S .GE. 1000000 ) GO TO 21 CONTINUESTOP2 CONTINUE. . .
DATA
DATA文は、変数、部分列、配列、配列要素を初期化します。
DATAnlist/clist/ [[,]nlist/clist/] ...
パラメータ 説明 nlist コンマで区切った変数、配列、配列要素、部分列、および DO型並びclist 形式 c [, c]... をもつ並び c 形式 c または r*c の 1 つ。c は定数または定数の定数名 r ゼロでない符号なし整定数、またはこのような定数の定数名
説明
実行可能プログラムの実行開始時に初期値を定義されていた項目は、すべて指定された値で定義されます。
DATA文は非実行文であり、すべての宣言文の後に現れなければなりませんが、文関数と実行文を混在させることができます (ただし、これは規格外となります)。©
注 - コンパイルに-stackvarオプションを使用した場合、実行文から局所変数が参照された後、DATA文でその局所変数を初期化するとエラーとして扱われます。『Fortran ユーザーズガイド』を参照してください。
clist の (反復因子を考慮に入れた) 定数の数は nlist の項目数と同じでなければなりません。nlist における配列の出現はその配列のすべての要素の並びを指定するのと同等です。配列要素は定数の添字によってだけ索引できます。
通常の型変換が clist の文字型でない各メンバーに対して起こります。
DATA文の文字定数nlist の文字項目の長さが対応する clist の定数より長い場合、右側に空白文字が詰められます。
nlist の文字項目の長さが対応する clist の定数より短い場合、余分な右側の文字が無視されます。
clist の定数が整数型で nlist の項目が文字型である場合、下記の規則に従ってください。
- 文字項目は 1 文字の長さでなければなりません。
- 定数は整数型で、0 から 255 までの範囲の値を持たなければなりません。
^A、^B、^Cは、Control キーを押しながら、A、B、または C キーを押して入力せずに、組み込み関数CHARを使用してください。clist の定数が文字定数またはホレリス定数で、nlist の項目が
INTEGER型である場合、割り当てられる文字の数はINTEGER*2とINTEGER*4に対しそれぞれ 2 と 4 です。文字定数またはホレリス定数が項目の容量より少ない文字数を持つ場合、定数は右側にスペースで拡張されます。文字またはホレリス定数が格納できるより多くの文字を持つ場合、定数の右側が切り捨てられます。
DO型並びnlist は配列要素を初期化するために
DO型並びを指定することができます。
パラメータ
説明
dlist
配列要素名と DO型並びの並び
iv
DO変数と呼ばれる整変数
m1
iv の初期値を指定する整定数式
m2
iv の終値を指定する整定数式
m3
iv の増分値を指定する整定数式。m3 が省略されるとデフォルトの値 1 がとられる。
DO型ループの範囲は dlist です。DO型ループの繰り返し回数は m1、m2、および m3 から計算され、必ず正です。
DO型並びは、入出力文PRINT、READ、WRITEの変数並びにも使用されることがあります。変数
変数は型宣言文でも初期化できます。これは FORTRAN 77 規格の拡張です。これらの例を個々の型宣言文と一般的な型宣言文のところで説明します。©
例
例 1 : 文字、整数、および実数スカラー。実数配列。
CHARACTER TTL*16REAL VEC(5), PAIR(2)DATA TTL / '任意のタイトル' /,& M / 9 /, N / 0 /,& PAIR(1) / 9.0 /,& VEC / 3*9.0, 0.1, 0.9 /...
例 2 : 配列−DO 型
REAL R(3,2), S(4,4)DATA ( S(I,I), I=1,4) / 4*1.0 /,& (( R(I,J), J=1,3), I=1,2) / 6*1.0 /...
例 3 : 整数と文字の混在
CHARACTER CR*1INTEGER I*2, N*4DATA I / '00' /, N / 4Hs12t /, CR / 13 /...
DECODE/ENCODE
ENCODEは文字変数、配列、または配列要素に書き込みます。©DECODEは文字変数、配列、または配列要素から読み取ります。データは書式識別子に従って編集されます。同様の機能は内部ファイルに書式付き順次
WRITE文、READ文を使用して達成することができます。ENCODEおよびDECODEは FORTRAN 77 規格にはありませんが、Fortran 77 の旧バージョンとの互換性のために提供されています。
ENCODE(size, f, buf[, IOSTAT=ios] [, ERR=s] ) [iolist]
DECODE(size, f, buf[, IOSTAT=ios] [, ERR=s] ) [iolist]
説明
入出力並びの構成要素としては、変数、部分列、配列、配列要素、記録欄が可能です。単純な添字なし配列名は、配列のすべての要素を記憶領域順で指定します。左端の添字が最も速く増加します。
例
ENCODE文は書式識別子に従って並びの項目を文字形式に変換し、文字を buf に格納します。内部ファイルのWRITE文も同じ操作を行います。DECODE文は書式識別子に従って buf の文字データを内部 (2 進) 形式に変換し、並びの項目に格納します。READ文も同じ操作を行います。- buf が配列の場合、その要素は左端の添字が最も速く増加する順序で処理されます。
ENCODEまたはDECODE文が処理することのできる文字数は buf のデータ型によります。たとえば、INTEGER*2配列は 1 要素当たり 2 文字を持つことができるので、文字の最大数は配列の要素数の 2 倍になります。文字変数または文字配列要素はその長さに等しい数の文字を持つことができます。文字配列は各要素の長さと要素数の積に等しい数の文字を持つことができます。- 書式識別子と入出力並びの間の関係は書式付き入出力文と同様です。
CHARACTER S*6 / '987654' /, T*6INTEGER V(3)*4DECODE( 6, '(3I2)', S ) VWRITE( *, '(3I3)') VENCODE( 6, '(3I2)', T ) V(3), V(2), V(1)PRINT *, TEND
98 76 54547698
DECODEは文字Sを 3 つの整数として読み取り、それらをV(1)、V(2)、およびV(3)に格納します。
ENCODE文は値V(1)、V(2)、およびV(3)を文字としてTに書き込みます。Tは'547698' になります。
DIMENSION
DIMENSION文は配列の次元数とそれぞれの次元の要素数を指定します。
DIMENSION文で任意に各項目の初期値を与えることができます。
DIMENSIONa ( d ) [,a ( d )] ...
パラメータ 説明 a 配列名 d 配列の形状を指定します。コンマにより区切られた 1 個から 7 個までの
宣言子の並び。
説明
寸法宣言子
それぞれの寸法の上下限は寸法宣言子により決められます。寸法宣言子の形式は次のとおりです。
[ dd1 :] dd2dd1 と dd2 は上下限値を指定する寸法上下限式です。これらには整数型または実数型の算術式が使用できます。これらは定数、定数名、仮引数、または
COMMON文で定義された変数を使用して作成することができます。配列引用およびユーザー定義関数の引用は次元上下限式では使用できません。dd2 はアスタリスクも可能です。dd1 が指定されないと値 1 がとられます。dd1 の値は dd2 以下でなければなりません。非定数の寸法上下限式は、整合配列を定義するために副プログラムで使用できます。しかし主プログラムでは使用できません。
非整数の上下限式は使用する前に整数に変換されます。小数部は切り捨てられます。
整合配列
寸法宣言子が仮引数または
COMMON文で定義された変数を含む算術式である場合、この配列は整合配列と呼ばれます。この場合、寸法は副プログラムへの入口の引数の初期値に等しくなります。大きさ引き継ぎ配列
配列は、寸法宣言子にアスタリスクがある場合、大きさ引き継ぎ配列と呼ばれます。この場合、寸法の上限は規定されません。アスタリスクは仮配列にだけ使用可能で、配列宣言子の最後の寸法の上限として現れます。
例
例 1 : 主プログラムの配列
DIMENSION M(4,4), V(1000)...END
上記の例では、
例 2 : サブルーチンの整合配列Mは形状 4 × 4 の配列として指定され、Vは形状 1000 の配列として指定されます。
SUBROUTINE INV( M, N )DIMENSION M( N, N )...END
上記の例では仮引数は配列
例 3 : 上下限Mと変数Nです。Mは形状N×Nの平方配列用として指定されます。
DIMENSION HELIO (-3:3, 4, 3:9)...END
上記では
例 4 : 上下限付き仮配列HELIOは三次元配列です。最初の要素はHELIO(-3,1,3)で、最後の要素はHELIO(3,4,9)です。
SUBROUTINE ENHANCE( A, NLO, NHI )DIMENSION A(NLO : NHI)...END
例 5 : 非整数の上下限
PARAMETER ( LO = 1, HI = 9.3 )DIMENSION A(HI, HI*3 + LO )...END
例 6 : 非整数の上下限付き整合配列
SUBROUTINE ENHANCE( A, X, Y )DIMENSION A(X : Y)...END
例 7 : 大きさ引き継ぎ配列
SUBROUTINE RUN(A,B,N)DIMENSION A(*), B(N,*)...
DOvariable = e1, e2 [, e3 ]
パラメータ 説明
variable 整数型、実数型、倍精度型、またはバイト型の変数 e1, e2, e3 整数型、実数型、または倍精度型の式で、それぞれ初期値、限界値、および増分値を指定する。
説明
文番号付き
DOループ端末文
s により識別される文は端末文と呼ばれます。端末文は
DO文と同一のプログラム単位内の一連の文の中で、DO文の後に続かなければなりません。端末文が論理
IF文である場合、下記以外のすべての実行文を含むことができます。
DOループの範囲
DOループの範囲は、端末文までのDO文に続いて現れる (端末文を含む) すべての実行文から構成されます。
DO文が他のDOループの範囲内に現れる場合、その範囲は外側のDOループの範囲内に完全に含まれなければなりません。2 つ以上の文番号付きDOループが同一の端末文を持つことができます。
DO文がIF、ELSE IF、またはELSEブロック内に現れる場合、関連DOループの範囲は完全にそのブロック内に含まれなければなりません。ブロック
IF文がDOループの範囲内に現れる場合、対応するEND IF文もそのDOループの範囲内に現れなければなりません。ブロック
DOループ ©1. 式 e1、e2、および e3 が評価されます。e3 が存在しない場合、その値は 1 とされます。2.DO変数は e1 の値で初期化されます。3. 繰り返し回数は式の値として確立されます。
MAX(INT((e2 - e1 + e3)/),e3, 0)- 下記のどれかが真の場合、繰り返し回数はゼロなので注意してください。
- コンパイル時オプション
-onetripが指定されると、繰り返し回数は 1 より小さくはなりません。4. 繰り返し回数が検査され、それがゼロより大きい場合、DOループの範囲が実行されます。端末文処理
DOループの端末文が実行された後、以下の処理が実行されます。1.DO変数の値があると、その値はDO文の実行時に計算された e3 の値だけ増分されます。2. 繰り返し回数は 1 ずつ減ります。3. 繰り返し回数が検査され、それがゼロより大きい場合、制限事項DOループの範囲内の文が再び実行されます。
DO変数はDOループの範囲内ではどの様な方法でも変更しないでください。注釈
DOループの範囲外からDOループの範囲内に飛び込まないでください。
場合によっては、終値に対して
DO変数を検査する前に実行される増分の演算の結果、DO変数がオーバーフローする場合があります。これが起こるときは、プログラムに誤りがあっても、コンパイラも実行システムもそれを検出しません。この状態では、DO変数がオーバーフローしてもループは予定通り終了します。
DOループの範囲外からDOループの範囲内に飛び込んだ場合、警告が発生されますが、実行は継続されます。範囲外からの飛び先が端末文で、それが
例CONTINUEでもあり、入れ子になったDOループの端末文でもある場合、常に内側のDOループのほとんどが実行されます。
例 1 : 入れ子になったDOループ
内部ループは実行されず、
例 2 : プログラムWRITEのときはLが未定義です。ここでLは 0 として示されていますが、これは処理系によって異なります。この例とは同じではない場合があります。DoNest2.f(常に定義されているDO変数)
INTEGER COUNT, OUTERCOUNT = 0DO OUTER = 1, 5NOUT = OUTERDO INNER = 1, 3NIN = INNERCOUNT = COUNT+1END DOEND DOWRITE(*,*) OUTER, NOUT, INNER, NIN, COUNTEND
6 5 4 3 15
DO WHILE
DOWHILE© 文は、指定された条件が真である限り、1 組の文を繰り返し実行します。
パラメータ 説明 s 実行文の文番号 e 論理式
説明
1. 指定された式が評価されます。2. 式の値が真の場合、DOWHILEループの範囲内の文が実行されます。3. 式の値が偽の場合、制御はDOWHILEループに続く文に移ります。端末文
s が指定されると、それにより識別される文は端末文と呼ばれ、
DOWHILE文の後に続かなければなりません。端末文が論理
IF文である場合、下記以外のすべての実行文を含むことができます。s が指定されない場合、
DOWHILEループはENDDO文で終わらなければなりません。DO WHILE ループの範囲
DOWHILEループの範囲は、DOWHILE文に続いて現れる端末文までの (端末文を含む) すべての実行文から構成されます。
DOWHILE文が他のDOWHILEループの範囲内に現れる場合、その範囲は外側のDOWHILEループの範囲内に完全に含まれなければなりません。 2 つ以上のDOWHILEループが同一の端末文を持つことができます。
DOWHILE文がIF、ELSE IF、またはELSEブロック内に現れる場合、関連するDOWHILEループの範囲は完全にそのブロック内になければなりません。ブロック
IF文がDOWHILEループの範囲内に現れる場合、対応するENDIF文もそのDOWHILEループの範囲内に現れなければなりません。端末文処理
制限事項
DOWHILEループの端末文が実行された後、制御は対応するDOWHILE文に返されます。
注釈
DO WHILEループの外側からDO WHILEループの内側に飛び込むと、予測できない結果を生ずることがあります。
e で使用される変数は、
例DOWHILEループの範囲内ではどのようにでも修飾することができます。
例 1 : 文番号のないDOWHILE
INTEGER A(4,4), C, R...C = 4R = 1DO WHILE ( C .GT. R )A(C,R) = 1C = C - 1END DO
例 2 : 文番号付きDOWHILE
INTEGER A(4,4), C, R...DO 10 WHILE ( C .NE. R )A(C,R) = A(C,R) + 1C = C+110 CONTINUE
DOUBLE COMPLEX
DOUBLECOMPLEX© 文は、倍精度複素数型を指定します。この文で配列次元と大きさを指定し、初期値を与えることもできます。
DOUBLE COMPLEXv[/c/] [,v[/c/] ...
パラメータ 説明 v 定数名、変数、配列、配列宣言子、関数、または仮関数の名前 c この前にくる名前についての定数の並び
説明
宣言は DOUBLE COMPLEXまたはCOMPLEX*16です。
DOUBLE COMPLEX©
DOUBLECOMPLEXZのように宣言すると、変数Zはメモリー内で連続する 2 つのREAL*8要素で、1 つの倍長の複素数と解釈されます。
DOUBLE COMPLEX Zなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
COMPLEX*16©注釈
COMPLEX*16Zのような宣言では、変数Zはメモリー内で連続する 2 つのREAL*8要素で、1 つの倍長の複素数と解釈されます。
各複素数組み込み関数には倍精度複素数用のものがあります。一般に、その関数名は
Cの代わりにZまたはCDで始まります。たとえば、SIN()、CSIN()、CDSIN()などです。2 つの関数DIMAGとDREALは例外で、実数値を返します。
DOUBLE COMPLEX U, VDOUBLE COMPLEX W(3,6)COMPLEX*16 X, Y(5,5)COMPLEX U*16(5), V(5)*16
DOUBLE PRECISION
DOUBLEPRECISION文は、型を倍精度に指定し、配列形状を指定し、初期値を与えることもできます。
DOUBLE PRECISIONv[/c/] [,v[/c/] ...
パラメータ
説明
v
定数名、変数、配列、配列宣言子、関数、または仮関数の名前
c
この前にくる名前についての定数の並び
説明
宣言は DOUBLE PRECISIONまたはREAL*8です。
DOUBLE PRECISION
DOUBLE PRECISION Xのように宣言すると、変数Xはメモリー内のREAL*8要素で、1 つの倍長の実数と解釈されます。サイズを指定しない場合、デフォルトサイズが使用されます。
DOUBLE PRECISION Xなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
REAL*8©
REAL*8Xのように宣言すると、変数Xは常にメモリー内のREAL*8型の要素で、倍長の実数と解釈されます。
DOUBLE PRECISION R, S(3,6)REAL*8 T(-1:0,5)
ELSE
ELSE文はELSEブロックの始まりを示します。
IF (e) THEN
...
ELSE
...
END IF
説明
制限事項
ELSEブロックは、ELSE文に続く、ENDIF文までの (ただし、ENDIF文は含まない) すべての実行文から構成されます。このときのENDIF文はELSE文と同じIFの深さです。詳細については、「IF ブロック」を参照してください。
ELSEブロックの外側からELSEブロックに移ることはできません。例
ELSEと同じIFの深さを有するENDIF文は、同じIFの深さを有するELSEIF、またはELSE文の前に現れなければなりません。
例 1 :ELSE
CHARACTER S...IF ( S .GE. '0' .AND. S .LE. '9' ) THENCALL PUSHELSECALL TOLOWEREND IF...
例 2 :ENDIFが期待されるところに無効のELSEIFがある場合
IF ( K .GT. 5 ) THENN = 1ELSEN = 0ELSE IF ( K .EQ. 5 ) THEN 正しくない...
説明
ELSE IF
一連の独立した検査を行うことが可能で、各検査は複数の文を指定できます。
ELSEIFブロックは、ELSEIF文に続く、ELSEIF文と同じIFの深さを有する次のELSEIF、ELSE、またはENDIF文までの (ただし、これらの文は含まない) すべての実行文から構成されます。1. e が評価されます。2. e が真の場合、ELSE IFブロックの最初の文から実行されます。e が真でELSE IFブロックが空の場合、そのELSE IF文と同じ IF の深さを有する次のEND IF文に制御が移ります。3. e が偽の場合、その制限事項ELSE IF文と同じIFの深さを有する次のELSE IF、ELSE、またはEND IF文に制御が移ります。
ELSEIFブロックの外側からELSEIFブロックに移ることはできません。
ELSEIF文の文番号があったとしても、いかなる文もそれを引用することはできません。例
ELSEIFと同じIFの深さを有するENDIF文は、同じIFの深さを有するELSEIFまたはELSE文の前に現れなければなりません。
例 :
ELSEIF
READ (*,*) NIF ( N .LT. 0 ) THENWRITE(*,*) 'N<0'ELSE IF ( N .EQ. 0) THENWRITE(*,*) 'N=0'ELSEWRITE(*,*) 'N>0'END IF
ENCODE/DECODE
ENCODE© 文は記憶領域の並びからデータを書き込みます。
ENCODE(size,f,buf[, IOSTAT=ios] [, ERR=s] ) [iolist]
パラメータ 説明 size 変換される文字数 f 書式識別子 buf 変数、配列、または配列要素 ios 入出力状態識別子 s 誤り識別子 (文番号) iolist 入出力項目の並びで、それぞれ文字変数、配列、または配列要素
説明
例
ENCODEは Fortran 77 の旧バージョンとの互換性のために提供されています。同様の機能は、内部ファイルに書式付き順次WRITE文を使用して達成することができます。ENCODEは FORTRAN 77 規格にはありません。
CHARACTER S*6, T*6INTEGER V(3)*4DATA S / '987654' /DECODE( 6, 1, S ) V1 FORMAT( 3 I2 )ENCODE( 6, 1, T ) V(3), V(2), V(1)
DECODEは文字Sを 3 つの整数として読みとり、それらをV(1)、V(2)、およびV(3)に格納します。ENCODE文は値V(3)、V(2)、およびV(1)を文字としてTに書き込みます。Tは'547698' になります。詳細および具体的な例については、「DECODE/ENCODE」を参照してください。
END
END文はプログラム単位の終わりを示し、以下の構文を使用します。
説明
END
主プログラムでは
END文はプログラムの実行を終了します。関数またはサブルーチンでは
END文はRETURNと同じ効果を持ちます。©FORTRAN 77 規格では
END文は継続行を持つことはできませんが、f77ではこれを許可します。©例
ENDIF文のような他のいかなる文も、END文とみなされるような開始行を持つことはできません。
PROGRAM MAINWRITE( *, * ) '極めて小さい'END
END DO説明
ENDDO© 文はDOループを終了し、以下の構文を使用します。
END DO
例
ENDDO文はブロックDO文の区切り文です。文番号がDO文で指定されない場合、対応する終了文はENDDO文でなければなりません。DOループの範囲内からだけENDDO文に分岐することができ、それによりDOループを終了します。
例 1 : 文番号付きDO
DO 10 N = 1, 100...10 END DO
例 2 : 文番号なしDO
DO N = 1, 100...END DO
END FILE
ENDFILE文は、指定された装置に結合したファイルに、次の記録としてファイル終了記録を書き込みます。
END FILE ( [ UNIT= ]u[, IOSTAT=ios] [, ERR=s])
パラメータ
説明
u
ファイルと結合した外部装置の装置識別子。オプションは任意の順に指定できるが、UNIT= を省略する場合は u を最初にする。
ios
入出力状態指定子。整変数または整数の配列要素。
s
誤り指定子 s は、END FILE 文が現れたプログラム中の実行文の文番 号。END FILE 文の実行時にエラーが発生すると、プログラムの制御は この文番号に渡される。
説明
磁気テープに、
ENDFILE文とその他の Fortran 77 規格入出力文を使用している場合は、代わりに信頼性の高いTOPEN()ルーチンを使用することをお勧めします。2 個のファイル終了記録は、テープ終了マークを意味します。テープファイルに書き込む場合、
制限事項ENDFILEは 2 個のファイル終了記録を書き込み、それから テープは 2 番目のファイル終了記録の前まで後退 (バックスペース) します。この場所でファイルを閉じると、ファイルの終了とテープの終了が表示されます。この場所から (次に現れるWRITE文、または磁気テープを巻き戻さないで他のプログラムで使用することによって) 更に記録が書き込まれる場合、最初のテープマーク (ファイル終了記録) の次に別のデータファイルが続き、そして更に 2 個のテープマークが書き込まれます。
u は順番探査ファイルに結合されます。直接探査ファイルでの
例ENDFILE文の実行は FORTRAN 77 規格で定義されていないので、結果は予測できません。したがって直接探査ファイルにENDFILE文を使用しないでください。
例 1 : 定数
END FILE 2END FILE ( 2 )END FILE ( UNIT=2 )
例 2 : 変数
LOGUNIT = 2END FILE LOGUNITEND FILE ( LOGUNIT )END FILE ( UNIT=LOGUNIT )
例 3 : エラートラップ
NOUT = 2END FILE ( UNIT=NOUT, IOSTAT=KODE, ERR=9)...9 WRITE(*,*) 'END FILE でエラー。装置番号:', NOUTSTOP
END IF説明
ENDIF文は、IFで始まるブロックIFの終わりを示し、以下の構文を使用します。
END IF
各ブロック
例IF文に対応するENDIF文は同じプログラム単位内になければなりません。対応するENDIF文はブロックIF文と同じIFの深さにあります。
例 1 :IF/ENDIF
IF ( N .GT. 0 )THENN = N+1END IF
例 2 :IF/ELSE/ENDIF
IF ( N .EQ. 0 ) THENN = N+1ELSEN = N-1END IF
END MAP説明
ENDMAP© 文は、MAP宣言の終わりを示し、以下の構文を使用します。
END MAP
詳細については、「UNION と MAP」を参照してください。
制限事項
例
...MAPCHARACTER *16 MAJOREND MAP...
END STRUCTURE説明
ENDSTRUCTURE© 文は、構造体宣言の終わりを示し、以下の構文を使用します。
END STRUCTURE
詳細については、「STRUCTURE」を参照してください。
例
STRUCTURE /PROD/INTEGER*4 IDCHARACTER*16 NAMECHARACTER*8 MODELREAL*4COSTREAL*4PRICEEND STRUCTURE
END UNION説明
ENDUNION© 文は、共用体宣言の終わりを示し、以下の構文を使用します。
END UNION
詳細については、「UNION と MAP」を参照してください。
例
UNIONMAPCHARACTER*16END MAPMAPINTEGER*2 CREDITSCHARACTER *8 GRAD_DATEEND MAPEND UNION
ENTRY
ENTRYen[ ( [fa[,fa] ... ] ) ]
パラメータ
説明 en
関数またはサブルーチン副プログラムの中の入口の英字名
fa
仮引数。仮引数は変数名、配列名、仮手続き名、または選択戻り文番号を指定するアスタリスク。
説明
入口名による引用手続き
サブルーチン副プログラム内で使用される入口名は、サブルーチンのように扱われ、
CALL文で引用できます。同様に、関数副プログラム内で使用される入口名は関数のように扱われ、関数として引用できます。入口名を
EXTERNAL文の中で指定し、実引数として使用できます。仮引数としては使用できません。入口副プログラム (サブルーチンまたは関数) の実行は、
ENTRY文の後の最初の実行文から始まります。
ENTRY文より物理的に前にある実行文で、そのENTRY文に出現する入口名を使用することはできません。引数の一致
ENTRY文の仮引数は、同じ副プログラム内のFUNCTION、SUBROUTINE、および他のENTRY文と、順序、数、型および名前が同一である必要はありません。関数、サブルーチン、または入口の引用で使用する実引数の並びは、対応するFUNCTION、SUBROUTINEまたはENTRY文の仮引数の並びと、順序、数、型および名前が一致しなければなりません。制限事項
ENTRY文内の選択戻り引数を指定する場合、仮引数の並びの中にアスタリスクを指定します。アンパサンドは代替として有効です。© 選択戻り引数を指定するENTRY文は、サブルーチン、副プログラムの中でだけ使用でき、関数の中では使用できません。
ENTRY文はブロックIF構造またはDOループの中では使用できません。例
ENTRY文が文字関数副プログラム中に現れる場合、その関数副プログラムと同じ長さを持つCHARACTER型として定義されます。
例 1 : サブルーチンの複数の入口
SUBROUTINE FIN( A, B, C )INTEGER A, BCHARACTER C*4...RETURNENTRY HLEP( A, B, C )...RETURNENTRY MOOZ...RETURNEND
上記の例では、サブルーチン
例 2 : 呼び出すルーチンの中で上記のサブルーチンと入口名を次のように呼び出します。FINが 2 つの選択的入口を持ちます。入口HLEPは引数の並びを持ち、入口MOOZは引数の並びを持ちません。
INTEGER A, BCHARACTER C*4...CALL FIN( A, B, C )...CALL MOOZ...CALL HLEP( A, B, C )...
上記のように
例 3 : 関数の複数の入口CALL文の順序はENTRY文の順序に合わせる必要はありません。
REAL FUNCTION F2 ( X )F2 = 2.0 * XRETURNENTRY F3 ( X )F3 = 3.0 * XRETURNENTRY FHALF ( X )FHALF = X / 2.0RETURNEND
EQUIVALENCE
EQUIVALENCE文は、プログラム単位内の複数の変数、または配列が同じ記憶領域を共有することを宣言します。
EQUIVALENCE (nlist) [, (nlist) ] ...
パラメータ
説明 nlist
コンマで分離された変数名、配列要素名、配列名、および部分列名の並び
説明
EQUIVALENCE文は、nlist の並びに現れる項目の記憶領域が同じ先頭アドレスを持つことを宣言します。
EQUIVALENCE文は、nlist で指定されていない項目の関連付けを引き起こすことがあります。配列名の指定は、配列の最初の要素を指定したのと同じ意味を持ちます。
制限事項
EQUIVALENCE文の中に配列要素名が現れる場合、添字の数は配列名の配列宣言子で指定される次元数より少ないか、または同じ数をとることができます。
仮引数、および関数の名前は、nlist には指定できません。
配列要素の添字は、下限より大きくかつ上限より小さいか等しい整定数でなければなりません。
EQUIVALENCE文は、自動変数を他の自動変数または記憶クラスと関連付けることができます。これらのクラスは、COMMON、STATIC、SAVE、DATA文、または仮関数であってはなりません。
EQUIVALENCE文は、文字型の要素と文字型でない要素とを関連付けることができます。©
EQUIVALENCE文は、同じ記憶単位が 1 つの記憶領域の中に 2 回以上現れるように宣言することはできません。たとえば次の文は実行できません。
DIMENSION A (2)EQUIVALENCE (A(1),B), (A(2),B)
EQUIVALENCE文は、連続する記憶単位を非連続になるように宣言することはできません。たとえば次の文は実行できません。
REAL A (2)DOUBLE PRECISION D (2)EQUIVALENCE (A(1), D(1)), (A(2), D(2))例
COMMON文とEQIVALENCE文が一緒に使用される場合、追加される規則があります。この規則については 「COMMON」を参照してください。
CHARACTER A*4, B*4, C(2)*3EQUIVALENCE (A,C(1)),(B,C(2))
A、B、およびCの関連は、以下のようになります。先頭 7 文字の位置は、以下のようにメモリーに割り当てられます。
01 02 03 04 05 06 07 A A(1) A(2) A(3) A(4)
B
B(1) B(2) B(3) B(4)
C C(1)(1) C(1)(2) C(1)(3) C(2)(1) C(2)(2) C(2)(3)
EXTERNAL
EXTERNAL文は、外部手続きまたは外部仮手続きであることを宣言し、それらの英字名を実引数として使用することを可能にします。
パラメータ
説明
proc
外部手続き、外部仮手続き、または初期値設定副プログラムの名前
説明
外部手続きまたは外部仮手続きが実引数ならば、この実引数は同じプログラム単位の中の
EXTERNAL文内になければなりません。組み込み関数名が
制限事項EXTERNAL文内に現れる場合、この組み込み関数名は外部サブルーチンまたは外部関数とみなされます。その名前の組み込み関数は、このプログラム単位内では使用できません。
1 つのサブルーチン名または関数名は、プログラム単位内で
例EXTERNAL文に 1 回だけ指定することができます。
例 1 : ユーザー作成のTANの使用
EXTERNAL TANT = TAN( 45.0 )...ENDFUNCTION TAN( X )...RETURNEND
例 2 : ユーザー定義関数名を引数として引き渡す
REAL AREA, LOW, HIGHEXTERNAL FCN...CALL RUNGE ( FCN, LOW, HIGH, AREA )...ENDFUNCTION FCN( X )...RETURNENDSUBROUTINE RUNGE ( F, X0, X1, A )...RETURNEND
FORMAT
パラメータ
説明
label
文番号
f
書式仕様並び
r
反復因子 (オプション)
desc
編集記述子。ただし r が表示されている場合 desc は反復可能な編集記述子であること。
反復可能な編集記述子には、次のものがあります。
IIwIw.dOOwOw.dZZwZw.dFFwFw.dAAwLLwEEwEw.dEw.d.eEw.dEeDDwDw.dDw.d.eDw.dEeGGwGw.dGw.d.eGw.dEe
- 'a1a2 ... an
'単引用符で区切られた文字列- "a1a2 ... an" 二重引用符で区切られた文字列
- nHa1a2
... anホレリス文字列$/:[k]R(k のデフォルトは 10)[k]P(k のデフォルトは 0)B,BNおよびBZS,SU,SPおよびSSTn および nTTL[n]およびTR[n](n のデフォルトは 1)[n]X(n のデフォルトは 1)編集記述子の詳細は 「書式付き入出力」を参照してください。
説明
FORMAT文には、記録の配置を作成または使用するための明示的な編集指示が含まれます。この編集指示は書式付き入出力文とENCODE/DECODE文で使用されます。反復因子
反復可能な編集記述子
記述子
I、O、Z、F、E、D、G、L、およびAは、編集方法を示し反復可能です。反復不可能な編集記述子
(")、($)、(')、(/)、(:)、B、BN、BZ、H、P、R、Q、S、SU、SP、SS、T、TL、TR、X項目分離文字
書式仕様並びの項目はコンマで分離されます。スラッシュまたはコロン編集記述子の前または後と、
P編集記述子とその直後のF、E、D、G編集記述子の間ではコンマは省略可能です。コンマがなくても意味が明白な所では省略できますが、上記の場合以外は規格外です。©変数式 ©
一般に書式中の整定数は、山括弧で囲んだ任意の式に置換できます。
1 FORMAT( ... <e> ... )n
制限事項H... 編集記述子の中の n は、変数式にはなりません。
注意事項
FORMAT文の文番号は、GOTO文、算術IF文、DO文、選択戻り文の中では使用できません。
明示的書式の場合、無効な書式文字列には、コンパイル時に警告とエラーメッセージ、またはそのどちらかが出されます。
変数書式の場合、無効な書式文字列には、実行時に警告とエラーメッセージ、またはそのどちらかが出されます。
<e>の変数書式の場合、無効な書式文字列には、コンパイル時または実行時に警告とエラーメッセージ、またはそのどちらかが出されます。詳細については、「実行時書式」を参照してください。
例
例 1 :A、I、およびF書式
READ( 2, 1 ) PART, ID, HEIGHT, WEIGHT1 FORMAT( A8, 2X, I4, F8.2, F8.2 )WRITE( 9, 2 ) PART, ID, HEIGHT, WEIGHT2 FORMAT( 'Part:', A8, ' Id:', I4, ' Height:', F8.2,& ' Weight:', F8.2 )
例 2 : 変数式
DO 100 N = 1, 50...1 FORMAT( 2X, F<N+1>.2 )
FUNCTION(外部)
FUNCTION文で始まるプログラム単位は関数副プログラムとして識別されます。
[ 型 ] FUNCTIONfun( [ar[,ar] ... ] )
(
COMPLEX*32とREAL*16は、SPARC のみ使用できます)。
[ 型 ] FUNCTIONfun[*m]([ar[,ar] ...])
パラメータ
説明
m
データ型の長さを指定するゼロ以外の符号なし整定数
ar 仮引数名
説明
関数の型
FUNCTION文に型がない場合、関数の型はデフォルトと、その後のIMPLICIT文または型宣言文によって決定されます。型がある場合、その関数名は他の型宣言文には指定できません。
注 - データ型のサイズが明示的に宣言されていない限り、オプション-dbl、-r8、-i2、または-xtypemapのいずれかを指定してコンパイルすると、関数への呼び出しまたは関数の定義で想定されるデフォルトのデータサイズが変更されます。これらのオプションの詳細については、第 2 章「データ型とデータ項目」と『Fortran ユーザーズガイド』を参照してください。
関数の値
関数の英字名は、変数名として副プログラム内になければなりません。関数副プログラム内の
RETURN文またはEND文が実行される時の、この変数の値が関数の値です。仮引数
引数の並びは、仮引数の数を定義します。これら仮引数の型はデフォルトの値、型宣言文、
IMPLICIT文、およびDIMENSION文の組み合せによって定義されます。仮引数の数は、この関数副プログラムを呼び出す時の実引数の数と同じでなければなりません。
関数は仮引数に値を割り当てることができます。割り当てられた値は、関数副プログラム内の
制限事項RETURN文またはEND文が実行されると、呼び出し側プログラムに返されます。
選択戻り指定子は、
FUNCTION文の中では許可されません。例
f77では再帰的な呼び出しが可能です。関数またはサブルーチンがそれ自身を直接呼び出すと、再帰的な呼び出しになります。関数またはサブルーチンが、他の関数またはサブルーチンを呼び出し、それが復帰する前に元の関数またはサブルーチンを呼び出した場合も、再帰的な呼び出しになります。
例 1 : 文字関数
CHARACTER*5 FUNCTION BOOL(ARG)BOOL = 'TRUE'IF (ARG .LE. 0) BOOL = 'FALSE'RETURNEND
上記の例で、
例 2 : 実数関数BOOLは 5 文字長のCHARACTER型の関数として定義されています。この関数は呼び出されると、変数ARGの値に応じて文字列TRUEまたはFALSEを返します。
FUNCTION SQR (A)SQR = A*ARETURNEND
上記の例で、関数
例 3 : 関数のサイズ、 代替構文 ©SQRは (デフォルトで)REAL型の関数として定義され、引き渡された数の 2 乗を返します。
INTEGER FUNCTION FCN*2 ( A, B, C )
INTEGER*2 FUNCTION FCN ( A, B, C )
GO TO(割り当て型)割り当て型
GOTO文は、変数に割り当てられた文番号値によって識別される文に分岐します。
パラメータ
説明
i
整変数名
s
実行文の文番号
説明
1. 割り当て型GO TO文の実行時、変数 i には、割り当て型GO TO文と同じプログラム単位内にある実行文の文番号値が割り当てられます。2. 割り当て型GO TO文が実行されると、制御は i によって識別される文に移されます。3. 文番号の並びが指定されている場合、i に割り当てられる文番号は並び内の文番号の制限事項
1 つでなければなりません。
i は、
GOTO文と同じプログラム単位内にあるASSIGN文によって割り当てられます。i は
INTEGER*4またはINTEGER*8でなければなりません。INTEGER*2であってはなりません。s は
GOTO文と同じプログラム単位内になければなりません。
GOTO文の中に同じ文番号が 2 回以上現れてもかまいません。分岐先の文は実行文でなければなりません。
DATA、ENTRY、FORMAT、INCLUDE文は指定できません。例
DO、IF、ELSEIF、ELSEブロックにブロックの外部から分岐することはできません。
ASSIGN 10 TO N...GO TO N ( 10, 20, 30, 40 )...10 CONTINUE...40 STOP
GO TO(計算型)計算型
GOTO文は、整数式または実数式の値に応じて並びから 1 つの文番号を選択し、制御をその文番号に渡します。
パラメータ 説明 s 実行文の文番号e 整数型または実数型の式GO TO (s[,s]...)[,]e 説明
1. 最初に e が評価され、必要であれば整数に変換されます。2. 1 ≦ e ≦ n (n は指定された文番号の数) のとき、指定された並びから e 番目の文番号が選択され、制御がその文番号に渡されます。3. e の値が範囲外、つまり e < 1 または e > n の場合、計算型制限事項GO TO文はCONTINUE文として実行されます。
s は
GOTO文と同じプログラム単位の中になければなりません。
GOTO文の中に同じ文番号が 2 回以上現れてもかまいません。分岐先の文は実行文でなければなりません。
DATA、ENTRY、FORMAT、INCLUDE文は指定できません。例
DO、IF、ELSEIF、ELSEブロックにブロック外部から分岐することはできません。
...GO TO ( 10, 20, 30, 40 ), N...10 CONTINUE...20 CONTINUE...40 CONTINUE
GO TO(単純)
s 実行文の文番号
説明
制限事項
GOTO文の実行により、制御は s の文番号が付いた文に渡されます。
s は
GOTO文と同じプログラム単位内になければなりません。分岐先の文は実行文でなければなりません。
DATA、ENTRY、FORMAT、INCLUDE文は指定できません。例
DO、IF、ELSEIF、ELSEブロックにブロックの外部から分岐することはできません。
A = 100.0B = 0.01GO TO 90...90 CONTINUE
IF(算術)算術
IF文は、算術式の値に応じて 3 個の指定された文の 1 つへ分岐します。
パラメータ
説明
e
算術式 (整数、実数、倍精度、または 4 倍精度)
s1, s2, s3
実行文の文番号
IF (e)s1, s2, s3 説明
IF文は算術式の値が負か、ゼロか、正かに応じて、それぞれ第 1、第 2、および第 3 文番号に制御を渡します。例
- s1、s2、s3は、
IF文と同じプログラム単位内になければなりません。- 同じ文番号が 2 回以上
IF文の中に現れてもかまいません。- 分岐先の文は実行文でなければなりません。
DATA、ENTRY、FORMAT、INCLUDE文は指定できません。DO、IF、ELSEIF、ELSEブロックにブロックの外部から分岐することはできません。
N = 0IF ( N ) 10, 20, 30
IF(ブロック)ブロック
IF文は、論理式の値に応じて複数の文の集合から 1 つを選択して実行します。
パラメータ
説明
e
論理式
説明
ブロック
IF文は論理式を評価し、論理式が真のときIFブロックと呼ばれる 1 組の文を実行します。論理式が偽のとき、制御は同じIFの深さの次のELSE、ELSEIF、ENDIF文に渡されます。
IFの深さ文 S の
IFの深さは、n1-n2 の値です。ここで n1 はプログラム単位の最初から S までの S を含むブロックIF文の数です。n2 はプログラム単位の中の S までのENDIF文の数です。S は含みません。例 : 次のプログラムの中の文 9 の
IFの深さは 2-1、つまり 1 です。
IF ( X .LT. 0.0 ) THENMIN = NODEEND IF...9 IF ( Y .LT. 0.0 ) THENMIN = NODE - 1END IFあらゆる文の
IFの深さは、ゼロか正の値です。IF、ELSEIF、ELSE、ENDIF文の各ブロックのIFの深さは、正の値でなければなりません。各プログラム単位のEND文のIFの深さは、ゼロでなければなりません。
IFブロック
IFブロックは、ブロックIF文からそのブロックIF文と同じIFの深さを持った次のELSE、ELSEIF、またはENDIF文までのすべての実行文 (ただしELSE、ELSEIF、ENDIFを含まない) で構成されています。IFブロックは空のことがあります。次の例では、2 つの代入文がIFブロックを構成します。
IF ( X .LT. Y ) THENM = 0N = N+1END IF1. 論理式 e が最初に評価されます。e が真のとき、IFブロックの最初の文から実行されます。2. e が真で IF ブロックが空のとき、制御はブロックIF文と同じIFの深さを持つ次のEND IF文 に渡されます。3. e が偽のときは、制御はブロックIF文と同じIFの深さを持つ次のELSE IF、ELSE、またはEND IF文に渡されます。4.制限事項IFブロックの最後の文が、文番号への分岐にならなかった場合、制御はそのIFブロックの前のブロックIF文と同じIFの深さを持つ、次のEND IF文に渡されます。
例
IFブロックの外部からそのIFブロックに分岐することはできません。
例 1 :IF-THEN-ELSE
IF ( L ) THENN=N+1CALL CALCELSEK=K+1CALL DISPEND IF
例 2 :ELSE-IFを含むIF-THEN-ELSE-IF
IF ( C .EQ. 'a' ) THENNA=NA+1CALL APPENDELSE IF ( C .EQ. 'b' ) THENNB=NB+1CALL BEFOREELSE IF ( C .EQ. 'c' ) THENNC=NC+1CALL CENTEREND IF
例 3 : 入れ子にされたIF-THEN-ELSE
IF ( PRESSURE .GT 1000.0 ) THENIF ( N .LT. 0.0 ) THENX = 0.0Y = 0.0ELSEZ = 0.0END IFELSE IF ( TEMPERATURE .GT. 547.0 ) THENZ = 1.0ELSEX = 1.0Y = 1.0END IF
IF(論理)論理
IF文は、論理式の値に応じて 1 つの文を実行するかしないかを決定します。
パラメータ
説明
e
論理式
st
実行文
IF (e)st 説明
論理
IF文は論理式を評価し、論理式の値が真のときは指定された文を実行します。論理式の値が偽のときは指定された文は実行されず、CONTINUE文が実行されたように実行が継続されます。st は任意の実行文です。
例DOブロック、IF、ELSE IF、ELSE、ENDIF、END、または論理IF文を除きます。
IF ( VALUE .LE. ATAD ) CALL PUNT!THEN がないことに注意IF ( TALLY .GE. 1000 ) RETURN
IMPLICIT
IMPLICIT文は、デフォルトの名前の型を確認または変更します。
IMPLICIT 型 (a[,a] ... ) [, 型 (a[,a] ... ) ]
IMPLICIT NONE
IMPLICIT UNDEFINED(A-Z)©
説明
暗黙の型宣言
IMPLICIT文は、プログラム単位内に暗黙の型宣言規則を適用しないことも宣言できます。
IMPLICIT文は、その指定の中に現れる英文字 (1 つの英文字またはある範囲の英文字) で始まるすべてのユーザー定義の名前について型と大きさを宣言します。
IMPLICIT文は、IMPLICIT文を含むプログラム単位の中でだけ適用されます。プログラム単位は、2 つ以上の
IMPLICIT文を含むことができます。型宣言文によって宣言されたユーザー定義の名前に対しては、
IMPLICIT文の宣言は無効になります。
注 - オプション-dbl、-i2、-r8、または-xtypemapのいずれかを指定してコンパイルすると、IMPLICIT REAL(A-Z)のようにサイズを指定しないIMPLICIT文によって型宣言された名前の想定サイズが変更されることがあります。詳細については、第 2 章「データ型とデータ項目」と『Fortran ユーザーズガイド』を参照してください。
非暗黙の型宣言
IMPLICIT文の第 2 の形式は、ユーザー定義の名前に暗黙の型宣言を適用しないこと、およびすべてのユーザー定義の名前は明示的に宣言された型を持つことを指定します。制限事項
IMPLICITNONEまたはIMPLICITUNDEFINED(A-Z)が指定された場合には、プログラム単位内に他のIMPLICIT文は存在できません。
IMPLICIT文は、他のすべての宣言文の前になければなりません。同じ英文字が 1 つの英文字、またはある範囲の英文字群として、1 つのプログラム単位のすべての
IMPLICIT文の中に 2 回以上現れてもかまいません。©FORTRAN 77 規格は、これを 1 回だけに制限しています。
例f77の場合には、英文字が 2 回以上使用されると使用のたびに順番に宣言されます。例 4 を参照してください。
例 1 :IMPLICIT、すべてが整数
IMPLICIT INTEGER (A-Z)X = 3K = 1STRING = 0
例 2 :U、V、またはWで始まる場合は複素数、CまたはSで始まる場合は文字
IMPLICIT COMPLEX (U,V,W), CHARACTER*4 (C,S)U1 = ( 1.0, 3.0)STRING = 'abcd'I = 0X = 0.0
例 3 : すべての項目に宣言が必要な例
IMPLICIT NONECHARACTER STR*8INTEGER NREAL YN = 100Y = 1.0E5STR = 'Length'
上記の例のように最初に
例 4 : 英文字を 2 回使用 ©IMPLICITNONEが指定されると、すべての変数が明示的に宣言されなければなりません。
IMPLICIT INTEGER (A-Z)IMPLICIT REAL (A-C)C = 1.5E8D = 9
上記の例で
A-ZはINTEGERを、A-CはREALを意味します。
INCLUDE
INCLUDE© 文は、ファイルを原始プログラムに挿入します。
パラメータ
説明
file
挿入されるファイルの名前
INCLUDE 'file'説明
名前を指定されたファイルの内容が
INCLUDE文に置き換えられます。探索パス
INCLUDE文で引用されている名前が文字 / で始まる場合、f77はINCLUDEファイルの絶対パス名を意味するものと解釈します。それ以外の場合、f77は次に示す順序で以下のディレクトリの中からファイルを探します。
INCLUDE文を持つ原始ファイルを含むディレクトリ。-Ilocオプションで名前を指定されたディレクトリ。f77のコマンドが出された現在のディレクトリ。- デフォルトリストのディレクトリ。標準インストールの場合、デフォルトリストは次のようになります。
/opt/SUNWspro/<release>/include/f77 /usr/include
- ディレクトリ/mydir/への非標準インストールの場合、デフォルトリストは次のようになります。
/mydir/SUNWspro/<release>/include/f77 /usr/include
<release>は、コンパイラのリリースによって異なります。これらの
INCLUDE文は、10 段階の深さまで入れ子にすることができます。プリプロセッサの
#include
INCLUDE文で検索したパスと順序は、『Fortran ユーザーズガイド』の-Iオプションの説明にあるように、プリプロセッサの#include指令で検索するものと同じではありません。プリプロセッサの#include指令によって取り込まれたファイルは、#defineなどを含むことができるのに対して、コンパイラのINCLUDE文で取り込まれたファイルは Fortran 文以外を含むことはできません。INCLUDE 文の中の VMS 論理ファイル名
f77は次の場合にINCLUDE文の VMS 論理ファイル名を解釈します。
- ここで各 lname は論理名、path1、path2 はディレクトリのパス名 (終わりの
'/'は付かない) です。例
- この文字列を解析するとき、すべての空白は無視されます。終わりの
/[no]list は、INCLUDE文のファイル名から取り去られます。- ファイル名の中の論理名は VMS ファイルの中で最初の
:によって区切られるため、f77は lname1:file 形式のファイル名を path1/file 形式に変換します。- 論理名は、大文字/小文字が区別されます。論理名が、
LOGICALNAMEMAPPINGで指定されていないINCLUDE文で発見された場合には、ファイル名は変更されずそのまま使用されます。
例 1 : 基本的なINCLUDEの例
INCLUDE 'stuff'
例 2 :
- これはファイル stuff の内容に置換されます。
INCLUDEの探索パス
- 条件は次のとおりです。
上記の場合、
f77は 以下に示す順序でこれらのディレクトリの中のconst.hを探します。標準インストールの場合、
f77は以下のディレクトリを探索します。
ディレクトリ/mydirへの非標準インストールの場合は、/optを/mydirに置き換えます。<release> パスは、コンパイラのリリースごとに変わります。
INQUIRE
INQUIRE文は、装置またはファイルについての情報を返します。
パラメータ
説明
fn
問い合わせされるファイルの名前
u
問い合わせされるファイルの番号
slist
指定子並び。下記の中の 1 つまたは複数を任意の順で含むことができる。
INQUIRE( FILE=fn, slist)説明
ファイルが存在するか、開かれているか、または順番入出力に結合されているかを確認できます。ファイルは名前、存在する (またはしない)、および特定の方法 (
FORMATTED、UNFORMATTED、SEQUENTIAL、またはDIRECT) で結合可能か否かなどの属性を持ちます。装置またはファイル名で問い合わせを行うことができますが、同一の文の中で両方で問い合わせることはできません。
このシステム環境の中で、あるファイルに関してユーザーが持つアクセス権を知る唯一の方法は、ACCESS(3F) 関数を使用することです。
INQUIRE文では、アクセス権を検出できません。次の表は、
INQUIRE文の指定子についてまとめたものです。
*は、装置による問い合わせが規格外であるが、f77では受け付けられることを示す。
†は、ファイルによる問い合わせが規格外であるが、f77では受け付けられることを示す。
- 一時ファイルの場合には、
NAMEDとNUMBERは返されません。- 指定された名前を持つファイルがない場合、次に示す指定子は返されません。
DIRECT、FORMATTED、NAME、NAMED、SEQUENTIAL、およびUNFORMATTEDOPENED=.FALSE.の場合、次に示す指定子は返されません。ACCESS、BLANK、FORM、NEXTREC、およびRECL- 指定された装置にファイルが結合されていない場合、次に示す指定子は返されません。
ACCESS、BLANK、DIRECT、FORM、FORMATTED、NAME、NAMED、NEXTREC、NUMBER、RECL、SEQUENTIAL、およびUNFORMATTEDACCESS='SEQUENTIAL' のとき、RECLとNEXTRECは不定です。FORM='UNFORMATTED' のとき、BLANKは返されません。
INQUIRE指定子のキーワード
INQUIRE指定子のキーワードに関する詳細は以下のとおりです。ACCESS = acc
- acc は、結合が順番入出力用のときは値 '
SEQUENTIAL' を、直接入出力用のときは'DIRECT' を代入される文字変数です。結合されていないときの値は未定義です。BLANK = blnk
- blnk は、書式付き入出力に結合されているファイルに対して
NULL空白制御が有効なときは'NULL' が代入され、空白がゼロに変換されているときは 'ZERO' が代入される文字変数です。DIRECT = dir
- dir は、ファイルが直接入出力に結合できるときは値 '
YES' を、結合できないときは値'NO' を、システムが回答できないときは'UNKNOWN' を代入される文字変数です。ERR = s
- s は
INQUIRE文の実行時にエラーが起きたときに分岐する文の文番号です。EXIST = ex
- ex は、ファイルまたは装置が存在するときは .
TRUE. に設定され、存在しないときは
.FALSE. に設定される論理変数です。リンクされたファイルが存在しない場合でも、ファイルがリンクである時は、INQUIREは、.TRUE.を常に返します。FILE = fn
- n はファイルの名前を持つ文字式または * です。ファイル名に続く空白は無視されます。ファイル名がすべて空白のときは現在のディレクトリです。ファイルは現行プログラムの中で装置に結合している必要はありません。
FORM = fm
- fm は、ファイルが書式付き入出力に結合されているときは値 '
FORMATTED' を、書式なし入出力に結合されているときは値'UNFORMATTED' を、非構造化入出力でファイルが開かれたときは値'BINARY'を代入される文字変数です。©FORMATTED = fmt
- fmt は、ファイルが書式付き入出力に結合できるときは値
'YES' を、結合できないときは'NO' を、システムが回答できないときは'UNKNOWN' を代入される文字変数です。IOSTAT = ios
- ios は
OPEN文の中の ios と同じです。NAME = fn
- fn は、装置に結合されているファイルの名前を代入される文字変数です。ユーザーが装置番号で問い合わせたとき、
OPENEDとNAMED変数が両方とも真でなければ、名前パラメータは未定義です。ファイル名で問い合わせたときは、この名前パラメータが返されます。ただし FORTRAN 77 規格では未定義のままです。NAMED = nmd
- nmd は、ファイルが名前を持っているときは .
TRUE. に設定され、ファイルが名前を持っていないときは .FALSE. に設定される論理変数です。NEXTREC = nr
- nr は、直接探査に結合されているファイルから読み取った最終記録の番号に 1 を加えた整変数です。ファイルが結合されていない場合は、-1 が戻されます。
NUMBER = num
- num は、装置に結合されているファイルがあれば、装置の番号に設定される整変数です。結合されているファイルがない場合、- 1 に設定されます。
OPENED = od
- od は、ファイルが装置に、または装置がファイルに結合されているときは .
TRUE. に設定され、結合していないときは .FALSE. に設定される論理変数です。RECL = rcl
- rcl は、ファイルが直接探査に結合されているときにファイル記録の記録長が割り当てられる整変数です。
-xl[d]オプションが設定されていると、f77はINQUIRE文が戻す rcl を調整しません。-xl[d]オプションが設定されていると、OPEN文がこの調整を行います。-xl[d]についての説明は、「-xl[d] オプションを必要とする機能の詳細」を参照してください。結合されているファイルがない場合、rcl は -1 に設定されます。SEQUENCIAL = seq
- seq は、ファイルが順番入出力に結合できるときは値 '
YES' を、順番入出力に結合できないときは値'NO' を、システムが回答できないときは'UNKNOWN' を代入される文字変数です。UNFORMATTED = unf
- fmt は、ファイルが書式なし入出力に結合できるときは値 '
YES' を、結合できないときは'NO' を、システムが回答できないときは 'UNKNOWN' を代入される文字変数です。UNIT = u
例
- u は装置番号を指定する整数式または * です。
FILEか、またはUNITの 1 つだけを使用します。
例 1 : 装置による問い合わせ
LOGICAL OKINQUIRE( UNIT=3, OPENED=OK )IF ( OK ) CALL GETSTD ( 3, STDS )
例 2 : ファイルによる問い合わせ
LOGICAL THEREINQUIRE( FILE='.profile', EXIST=THERE )IF ( THERE ) CALL GETPROFILE( FC, PROFILE )
例 3 : 複数の応答、UNIT=を省略
CHARACTER FN*32LOGICAL HASNAME, OKINQUIRE ( 3, OPENED=OK, NAMED=HASNAME, NAME=FN )IF ( OK .AND. HASNAME ) PRINT *, 'ファイル名="', FN, '"'
INTEGER
INTEGER文は、定数名、変数、配列、関数、仮関数の型を整数型に宣言します。また配列の次元と大きさを指定し、初期値を与えることもできます。
パラメータ
説明
v
定数名、変数、配列、配列宣言子、関数または仮関数の名前
len
定数名、変数、配列要素または関数のバイト単位の長さで、2、4 または 8。8 は -dblがオンのときのみ指定できます。
c
直前にくる名前の定数の並び
INTEGER [*len[,]]v[*len[/c/]] [,v[*len[/c/]] ...説明
宣言としては、
INTEGER、INTEGER*2、INTEGER*4、INTEGER*8が可能です。
INTEGER
INTEGER Hなどの宣言の場合、通常、変数Hはメモリー内の 1 つのINTEGER*4要素であり、1 つの整数値として解釈されます。サイズの指定は規格外です。©サイズを指定しない場合、デフォルトサイズが使用されます。
INTEGER Hなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-i2、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
INTEGER*2©
INTEGER*2 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*2要素であり、1 つの整数値として解釈されます。
INTEGER*4©
INTEGER*4 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*4要素であり、1 つの整数値として解釈されます。
INTEGER*8©制限事項
INTEGER*8 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*8要素であり、1 つの整数値として解釈されます。
配列の添字には、
例INTEGER*8変数および 8 バイトの定数や式を使用しないでください。使用した場合は、末尾の 4 バイトのみが使用されます。インデックス値が 4 バイトの整数の幅を超えた場合、この動作によるプログラムの結果は予測できません。
例 1 : 以下の整数宣言は、それぞれ等価です。
INTEGER U, V(9)INTEGER*4 U, V(9)INTEGER U*4, V(9)*4
例 2 : 初期化
INTEGER U / 1 /, V / 4 /, W*2 / 1 /, X*2 / 4 /
INTRINSIC
INTRINSIC文は実引数として引き渡すことのできる組み込み関数を指定します。
パラメータ
説明
fun
関数名
INTRINSICfun[,fun] ...説明
組み込み関数の名前を実引数として使用する場合、それらは同一プログラム単位内の
INTRINSIC文に書かれていなければなりません。
制限事項
INTRINSIC SIN, COSX = CALC ( SIN, COS )
1 つの英字名は同一プログラム単位内の
EXTERNAL文とINTRINSIC文のどちらか一方でしか使用できません。実引数は個別名でなければなりません。ほとんどの総称名は個別名と同じですが、
IMAG、LOG、LOG10のようにそうでないものもあります。英字名は
INTRINSIC文で 2 回以上使用することができます。ただし、FORTRAN 77 規格では 1 回に限定されています。©以下の表の組み込み関数はインラインまたは総称なので実引数として引き渡すことはできません。
LOGICAL
LOGICAL文は、定数名、変数、配列、関数、仮関数の型を論理型に宣言します。
パラメータ
説明
v
定数名、変数、配列、配列宣言子、関数または仮関数の名前
len
定数名、変数、配列要素または関数のバイト単位の長さで、1、2、4、8 のいずれか。8 は -dblオプションがオンの場合のみ指定できます。©
c
この前にくる名前の定数の並び
LOGICAL [*len[,]]v[*len[/c/]] [,v[*len[/c/]] ...説明
宣言としては、
LOGICAL、LOGICAL*1、LOGICAL*2、LOGICAL*4、LOGICAL*8が可能です。
LOGICAL
LOGICAL Hなどの宣言の場合、通常、変数Hはメモリー内の 1 つのINTEGER*4要素であり、1 つの論理値として解釈されます。サイズの指定は規格外です。©サイズを指定しない場合、デフォルトサイズが使用されます。
LOGICAL Zなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-i2、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
LOGICAL*1©
LOGICAL*1 Hなどの宣言の場合、変数Hは必ずメモリー内のBYTE要素であり、1 つの論理値として解釈されます。
LOGICAL*2©
LOGICAL*2 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*2要素であり、1 つの論理値として解釈されます。
LOGICAL*4©
LOGICAL*4 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*4要素であり、1 つの論理値として解釈されます。
LOGICAL*8©例
LOGICAL*8 Hなどの宣言の場合、変数Hは必ずメモリー内の 1 つのINTEGER*8要素であり、1 つの論理値として解釈されます。
例 1 : 以下の整数宣言は、それぞれ等価です。
LOGICAL U, V(9)LOGICAL*4 U, V(9)LOGICAL U*4, V(9)*4
例 2 : 初期化
LOGICAL U /.false./, V /0/, W*4 /.true./, X*4 /'z'/
MAP
MAP© 宣言は共用体における欄の代替グループを定義します。
MAP欄宣言...[欄宣言]END MAP
説明
例
- 型宣言 (初期値を含めることもできます)
- 部分構造体 (別の構造体宣言または先に定義された記録のどちらか)
- 共用体宣言 (詳細については、「UNION と MAP」を参照してください)
STRUCTURE /STUDENT/CHARACTER*32 NAMEINTEGER*2 CLASSUNIONMAPCHARACTER*16 MAJOREND MAPMAPINTEGER*2 CREDITSCHARACTER*8 GRAD_DATEEND MAPEND UNIONEND STRUCTURE
NAMELIST
NAMELIST© 文は変数または配列名の並びを定義し、それを一意のグループ名と関連付けます。
パラメータ
説明
grname
グループの英字名
namelist
変数と配列の並び
NAMELIST /grname/namelist[[,] /grname/namelist] ...説明
NAMELIST文に含まれる、グループ名および変数群について説明します。グループ名
グループ名は変数群入出力文で使用され、読み取りまたは書き込みの対象となる変数または配列の並びを示します。変数群入出力文では入出力並びの代わりにこの名前が使用されます。グループ名は一意とし、読み取りまたは書き込みの可能な項目の並びを表します。
同一グループの変数はいくつかの
NAMELIST文によって別々に同一のグループ名で定義できます。これらの定義はまとめて 1 つのNAMELISTによるグループの定義とみなされます。変数群の項目
変数群の項目には変数または配列を指定することができ、これらの項目は複数の変数群に属することができます。変数群で指定された項目に限り変数群入出力での読み取りまたは書き込みが可能ですが、すべての項目に対して入力記録の中のデータを指定する必要はありません。
変数群の項目の順序により変数群出力への値の書き込み順序が制御されます。入力記録中では、項目はどのような順序で並んでいてもかまいません。
制限事項
入力データは、変数群に現れる配列の要素または文字列の部分列に値を割り当てることができます。
例
NAMELIST文 に以下のものを使用することはできません。
CHARACTER*16 SAMPLELOGICAL*4 NEWREAL*4 DELTANAMELIST /CASE/ SAMPLE, NEW, DELTAこの例ではグループ
CASEがSAMPLE、NEW、DELTAの 3 つの変数で構成されます。
OPEN
OPEN文は、既存の外部ファイルを装置に結合したり、ファイルを作成して装置に結合したり、あるいは結合の指定子を変更します。
説明
OPEN文は名前を指定されたファイルの型を決め、指定された結合がそのファイルの型に対して正当か不当かを判断します (たとえばDIRECTアクセスは磁気テープと tty デバイスに対しては不当となります)。ファイルが磁気テープ上にある場合、またはサブパラメータFILEOPT='BUFFER=n' が指定された場合は、その結合にバッファを割り当てます。既存のファイルが開処理で不完全なものになることは決してありません。
注 - テープ入出力の場合、TOPEN()ルーチンを使用します。
以下の表は各
OPENキーワード指定子について詳しくまとめたものです。
OPEN 指定子キーワード
以下に、OPEN 指定子キーワードについて詳しく説明します。
[UNIT=] u
- u は、装置番号を指定する整数式またはアスタリスク (*)。
u は必要です。u がパラメータ並びの最初にある場合はUNIT=を省略できます。FILE= fin
ファイル名を指定せずに (または前のファイル名で)、一度開いた装置を再び開こうとすると、Fortran はユーザーがパラメータ変更のためにファイルを開きなおそうとしているものと解釈します。ファイルの位置は変わりません。
ユーザーが変更できるパラメータはBLANK(NULLまたはZERO) とFORM(FORMATTEDまたは
- ファイル切り替え
すでに開かれている装置を再び開く際に前と異なるファイル名を指定した場合は、開く前に旧ファイル名で閉じたのと同じ状態になります。
- 装置交換
すでに開かれているファイルを再び開く際に前と異なる装置を指定した場合は誤りとなります。ただし、この誤りは
ERR=オプションでは検出されないため、プログラムは異常終了しません。
- 一時ファイル
ファイルが
STATUS='SCRATCH'で開かれると、一時ファイルが作成および開かれます。STATUS=sta を参照してください。ACCESS= acc
ACCESS=acc 句 は省略可能。accは文字式。可能な値はAPPEND、DIRECT、およびSEQUENTIALです。デフォルト値はSEQUENTIALです。ACCESS='APPEND'の場合SEQUENTIALおよびFILEOPT='EOF'とみなされます。ファイルを開くためのものであり、既存の順番探査ファイルに記録を追加します。ファイルにはWRITE操作だけができますが、エラー・メッセージは出力されません。これは拡張機能で、ディスクファイルのみに適用することができます。©ACCESS='DIRECT' の場合
入出力の転送はすべて固定長記録の倍数で実行されるため、RECLも指定しなければなりません。- 直接探査可能なファイルだけに限られるので、 tty、パイプ、磁気テープには使用できません。ファイルを順番探査ファイルとして作成した場合は直接探査できません。
FORMを指定しない場合は書式なし転送とみなされます。FORM='UNFORMATTED' の場合、転送サイズは転送されるデータによって異なります。ACCESS='SEQUENTIAL' の場合、RECLは無視されます。©FORTRAN 77 規格では順番探査でRECLは指定できません。- 記録はパディングされません。
- ファイルを直接探査ファイルとして作成した場合は、順番探査ファイルとしてアクセスすることはできません。
- tty、パイプ、磁気テープが使用されるという意味では、ファイルがランダムアクセスできなくてもかまいません。しかしテープの場合には
TOPEN()ルーチンを使用したほうが確実です。FORMを指定しない場合は書式付き転送とみなされます。FORM='FORMATTED' の場合、各記録は改行文字 (\n) で終了します。これによって、各記録の文字数は、実際は 1 文字増分されます。FORM='PRINT' の場合、ファイルは出力時の 1 桁目の文字の解釈
(空白 = 1 行送り、0 = 2 行送り、1 = 用紙送り、+ = 行送りなし) を除き、FORM='FORMATTED' ファイルと同様に処理されます。FORM='UNFORMATTED' の場合、各記録の前後にそれぞれINTEGER*4、すなわち 4 バイトが付けられ、通常の長さより 8 文字長くなります。この規定は他の言語には用いられていないため、Fortran 77 プログラム間でのデータの受け渡しに限り有用です。FORM= fm
FORM=fm 句は省略可能。fm は文字式。可能な値は、'FORMATTED'、'UNFORMATTED'、'BINARY' 、および'FORMATTED' です。- このオプションは
ACCESSと相互に関連しています。ACCESSの対象がプリントファイルになります。'BINARY' では、ファイルはレコードマークがない順番の書式なしファイルとして処理されます。©FORM='BINARY'でACCESS = 'DIRECT'やRECL=n を指定すると、エラーになります。WRITE 文は、出力並びのデータにあるバイト数と同じバイト数をバイナリで書き込みます。READ 文は、入力並びで要求されるバイト数を、入力ファイルから読み取ります。レコードマークは認識されないため、「レコード外」を読み取ることはできません。異常なシステムエラー以外で発生する可能性がある入力エラーは、エンドオブファイルの読取りだけです。FORM='BINARY'のファイルにはBACKSPACEは指定できず、実行時にエラーとなります。RECL= rl
RECL=rl 句はACCESS='DIRECT'の場合は必須。その他の場合は無視されます。- rl はファイルの各記録の長さを文字数で指定する整数式です。rl は正である必要があります。
- 記録の長さが分からない場合は
RECL=1を使用します。詳細については、「直接探査入出力」を参照してください。-xl[d]オプションが設定されていない場合、 rl は文字数で記録長は rl になります。-xl[d]が 設定されている場合、 rl はワード数で記録長は rl*4 になります。©- 詳細については前記の
ACCESS='SEQUENTIAL' の項を参照のこと。- 1 回の
WRITE操作につき 1 記録が定義され、1 回のREAD操作ごとに 1 記録が読み取られます (読み取られない文字はフラッシュされる)。- テープのデフォルトのバッファサイズは 64K 文字です。テープの場合は
TOPEN()ルーチンを使用したほうが確実です。ERR= s
ERR=s 句は省略可能。s はOPEN文の実行時にエラーが生じた場合に分岐する文の文番号です。IOSTAT= ios
IOSTAT=ios 句は省略可能。ios はOPEN文から誤り状態を受け取る整変数です。OPEN実行後、誤り状態がなければゼロ、あれば正となります。OPENでエラーが生じてもプログラムを異常終了したくない場合は、ERR=s またはIOSTAT=ios を指定します。BLANK= blnk
BLANK=blnk 句は省略可能。この句は書式化された入力専用句です。blnk は空白の扱われ方を指定する文字式です。可能な値はZEROおよびNULLです。'ZERO' − 空白はゼロとして扱われます。'NULL' − 数値変換時に空白は無視されます。デフォルトは 'NULL'です。STATUS= sta
STATUS=sta 句は省略可能。sta は文字式です。可能な値は'OLD'、'NEW'、'UNKNOWN'、および 'SCRATCH'です。'OLD'
ファイルはすでに存在していることを示します (存在しない場合は誤り)。
例 :STATUS='OLD''NEW'
ファイルは存在しないことを示します (存在している場合は誤り)'FILE=name' を指定しない場合は'fort.n' と名付けられたファイルが開きます (ここで n は指定された論理装置番号)。'UNKNOWN' − ファイルの存在が不明なことを示します (デフォルト)。'SCRATCH'STATUS='SCRATCH' でファイルが開かれると、tmp.FAAAAxnnnnn という名前の一時ファイルが開きます。関連するファイル名がない他のSTATUS識別子を使用すると、fort.n (n は指定した論理ユニット番号) という名前のファイルが開かれます。デフォルトでは、一時ファイルは閉じる時または通常終了時に削除される。プログラムが異常終了した場合、このファイルは削除されないことがあります。削除したくない場合は、STATUS='KEEP' オプションで閉じます。- FORTRAN 77 規格では、名前を指定したファイルを一時的に開くことはできません。
OPENにFILE=name オプションを指定する場合、STATUS='SCRATCH' オプションは指定できません。この Fortran 77 では、名前を指定したファイルを一時的に開くように拡張されています。© 通常、このようなファイルは閉じる時または通常終了時に削除されます。TMPDIR: 通常、scratchファイルは現在の作業ディレクトリに作成されます。TMPDIR環境変数が書き込み可能なディレクトリに設定されている場合、scratchファイルはそのディレクトリに作成されます。©FILEOPT= fopt ©
FILEOPT=fopt 句は省略可能。fopt は文字式です。可能な値は次のとおりです。'NOPAD' − 記録の終わりを超えて読み取る場合、空白を追加して記録を拡張することはありません (書式付き入力の場合に限る)。つまり、短い記録の読み取りは後ろに空白を加えて続行されることがなく、エラーメッセージが出されて異常終了します。'BUFFER'=n ― 入出力装置が使用するバッファサイズを n バイトに設定します。このサブオプションは、ディスクファイルなどの通常ファイルで使用するためのものです。効率を上げるには、バッファサイズをページサイズの倍数にします。バッファサイズを大きくすると、通常は、順次入出力の効率が向上します。バッファサイズが記録長の長さと等しい場合、通常は直接入出力の効率が最高に達します。ただし、例外として、記録長が 1 のときは、バッファサイズは最低 1 ページでなければなりません。
BUFFERサブオプションは、通常はテープファイルには使用しません。テープファイルでは、テープのハードウェア、制御装置、ファイルシステムによって適切なバッファサイズが決まります。テープドライブによっては、機能が限定されているものがあり、そのために、通常の Fortran 入出力が不安定になることがあります。そうしたドライブの代わりとして、Fortran ライブラリのテープ入出力ルーチン(topen(3F)参照) を推奨します。'EOF' − テープの始めからではなく、ファイル終了マークでファイルが開きます (ファイルにデータを追加するために使用する)。
例 :FILEOPT='EOF'ACCESS='APPEND' と異なり、READとBACKSPACEの両方の操作が可能です。READONLY ©
- ファイルを読み取り専用として開きます。
ACTION = act
例
- act はファイルのアクセス権を示します。可能な値は
READ、WRITE、READWRITEです。ACTION = READの場合、開かれるファイルは読み取り専用になります。ACTION = WRITEの場合、開かれるファイルは書き込み専用になります。書き込み専用のファイルでBACKSPACE文を実行することはできません。ACTION = READWRITEの場合、開かれるファイルは読み取りも書き込みも可能です。
例 1 : ファイルを開き、それを装置 8 に結合します。
次の
OPEN文のどちらもファイルprojectA/data.testを開き、それを FORTRAN 77 装置 8 に結合します。
OPEN( UNIT=8, FILE='projectA/data.test' )OPEN( 8, FILE='projectA/data.test' )上記の例ではデフォルトで、次の特性が確立されます。デフォルトの設定は順番探査、書式付きファイル、およびファイルを開く時のエラーを想定しません。
例 2 : 特性を明示的に指定します。
OPEN( UNIT=8, FILE='projectA/data.test', &ACCESS='SEQUENTIAL', FORM='FORMATTED' )
例 3 : 次のどちらもファイルfort.8を開き、それを装置 8 に結合します。
OPEN( UNIT=8 )OPEN( 8 )
上記の例では順番探査、書式付きファイルで、ファイルを開く時に誤りを想定しません。実行するにあたって、ファイル
例 4 : 開く時の誤りを想定します。fort.8が存在しない場合はfort.8が作成されます。このファイルは終了後も残ります。
OPEN( UNIT=8, FILE='projectA/data.test', ERR=99 )
上記の文では
例 5 : 変数長記録を許可します。、OPEN文の実行時に誤りが生じた場合は文番号99に分岐します。
OPEN( 1, ACCESS='DIRECT', recl=1 )
可変長記録に関する詳細については、「直接探査入出力」を参照してください。
例 6 : 一時ファイル
OPEN( 1, STATUS='SCRATCH' )
この文は、
tmp.FAAAa003zUなどの名前の一時ファイルを開きます。このファイルは通常、現在の作業ディレクトリか、(設定されていれば)TMPDIR変数の指すディレクトリに作成されます。
OPTIONS説明
OPTIONS© 文はコンパイラのコマンド行オプションを無効にします。
OPTIONS /修飾子 [/修飾子 ...]
以下の
表に、OPTIONS文の修飾子を示します。
制限事項
OPTIONS文はプログラム単位の先頭に置かなくてはなりません。つまりBLOCKDATA文、FUNCTION文、PROGRAM文、SUBROUTINE文の前ということです。
OPTIONS文により設定されたオプションは、コマンド行に指定したオプションを無効にします。例
OPTIONS文により設定されたオプションは、そのプログラム単位内でのみ有効です。
次の例ではサイズを明示されずに宣言された整変数は、コマンド行の
-i2オプションの有無にかかわらず、2 バイトではなく 4 バイトを占めます。これによって整定数のサイズは変更されず、変数のサイズだけが変更されます。
OPTIONS /I4PROGRAM FFT...ENDこれに対し
/NOI4を使用した場合は、サイズを明示されずに宣言されたすべての整変数は、コマンド行の-i2オプションの有無にかかわらず、4 バイトではなく 2 バイトを占めます。整定数は、-i2オプションがある場合は 2 バイト、ない場合は 4 バイトとなります。
PARAMETERPARAMETER (p=e[,p = e] ... )
-xlフラグを設定すると、代替構文を用いることができます。©
PARAMETER p = e [, p = e ] ...この代替形式では定数式の型により名前の型が決まりますが、変換は行われません。
説明
e は任意の型にすることができます。英字名とそれに対応する式の型は同じでなければなりません。
英字名を用いて、複素定数の実部、虚部、またはその両方を表すことができます。
定数式は、明示的な定数、パラメータ、および Fortran 演算子で構成されています。
詳細については、「定数式」を参照してください。浮動小数点数によるべき乗は使用できません。使用しようとすると警告が出されます。
英字の型がデータ式の型と同じでない場合は、英字名が
PARAMETER文に初めて現れる前に、型宣言文またはIMPLICIT文で英字名の型を指定しなければなりません。指定しないと変換されます。
CHARACTER文で英字名の長さが明示的に指定されている場合は、PARAMETER文の定数がそれより長くてはいけません。長い場合はその分が切り捨てられ、警告が出されます。CHARACTER文はPARAMETER文の前に書かなければなりません。
CHARACTER文が*(*)を用いて英字名の長さを指定した場合、その定数名の長さを決定するのにPARAMETER文のデータが使用されます。CHARACTER文はPARAMETER文の前に書かなければなりません。式 e の中で使用する定数の英字名はすべて、同一プログラム単位内の同じ、または別の
PARAMETER文であらかじめ定義しておかなければなりません。© Sun WorkShop FORTRAN 77 コンパイラでは
制限事項PARAMETER文が拡張され、非定数式を含むあらゆる式に対応できます。この文では、規格外であるという警告メッセージが常に表示され、シンボルが参照されたところでは、実行時に値が決められます。ただし、非定数式のあるPARAMETER文で定義したシンボルが、定数が必要となる文 (たとえばDATA文など) に使われると、エラーになります。
定数名は 1 つのプログラム単位内で 1 回しか定義できません。
PARAMETER文で定義した英字名は、そのプログラム単位内で別のものを表現するために使用することはできません。英字名は定数書式仕様で使用できませんが、変数書式仕様では使用することができます。
パラメータを引数として渡し、副プログラムがそのパラメータを変更しようとした場合、実行時エラーが発生します。
例
例 1 : 実数型のパラメータ、文字型のパラメータ、論理型のパラメータ
CHARACTER HEADING*10LOGICAL TPARAMETER (EPSILON=1.0E-6, PI=3.141593,& HEADING=' IO Error #',& T=.TRUE. )...
例 2 : コンパイラに文字数をカウントさせます。
CHARACTER HEADING*(*)PARAMETER ( HEADING='入出力エラー番号' )...
例 3 :-xlコンパイルフラグを指定した場合の代替構文
PARAMETER FLAG1 = .TRUE.
LOGICAL FLAG1PARAMETER (FLAG1 = .TRUE.)
PARAMETER文とも代入文とも解釈できるあいまいな文は、-xlまたは-xldのどちらかのオプションが指定されていれば、常にPARAMETER文とみなされます。
PARAMETER S = .TRUE.
-xlオプションが設定されていれば、上記の文は変数Sに関するPARAMETER文となります。
PARAMETER S = .TRUE.次のような変数
PARAMETERSに関する代入文とはみなされません。
PARAMETERS = .TRUE.
PAUSE
PAUSE文は実行を中断し、goが入力されるのを待ちます。
パラメータ
説明
str
5 桁以下の文字列または文字定数
PAUSE [str ] 説明
PAUSE文はプログラムの実行を一時中断し、再開の指示を待ちます。再開の指示があると実行が継続されます。引数文字列がある場合はそれが画面に表示されます (
stdoutに書き込まれます)。続いて次のメッセージが表示されます。
PAUSE: 実行を再開するには、go と入力します。その他の入力では、プログラムを中止します。
goを入力するとCONTINUE文を実行した場合と同様に実行が継続されます。以下はその例です。
demo% cat p.fPRINT *, "Start"PAUSE 1PRINT *, "Ok"ENDdemo%f77 p.f -silentdemo% a.outStartPAUSE: 1実行を再開するには、go と入力します。その他の入力では、プログラムを中止します。goPAUSE の後に実行を再開しました。Okdemo%
stdinがtty入出力装置ではない場合、PAUSEは次の形式のメッセージを表示します。
PAUSE:実行を再開するには、kill -15 pid と入力します。
demo% a.out < mydatafilePAUSE:実行を再開するには、kill -15 20537 と入力します。demo%メッセージを表示するウィンドウはコマンド入力を受け取ることができないため、上記の例では他のウィンドウのシェルプロンプトに以下のコマンド行を入力します 。
demo%kill -15 20537
POINTER
パラメータ
説明
v1, v2
ポインタ基底付き変数、指示先とも言う p1, p2
対応するポインタ
POINTER (p1, v1) [, (p2, v2) ... ]説明
ポインタ基底付き変数、すなわち指示先は
POINTER文によりポインタと対になった変数です。通常はポインタ基底付き変数のことを単に基底付き変数と言います。ポインタはアドレスを内容とする整変数です。(POINTER文で指定する変数名は、コンパイラではVOLATILEと見なされます)ポインタの使用法については、「ポインタ」を参照してください。
例
例 1 : 単純なPOINTER文
POINTER ( P, V )
ここで
例 2 :Vはポインタ基底付き変数で、Pはその関連付けられたポインタです。LOC()関数によるアドレスの獲得
* ptr1.f: LOC() を介してアドレスを割り当てるPOINTER ( P, V )CHARACTER A*12, V*12DATA A / 'ABCDEFGHIJKL' /P = LOC( A )PRINT *, V(5:5)END
上記の例では
例 3 :CHARACTER文はAに 12 バイトの記憶領域を割り当てますが、Vには記憶領域を割り当てません。Vはポインタ基底付き変数なので、型だけを指定します。次にAのアドレスをPに割り当てます。それによって、Vを使用するとポインタPによってAが引用されます。プログラムはEを出力します。MALLOCによるポインタへの記憶域割り当て
POINTER ( P1, X ), ( P2, Y ), ( P3, Z )...P1 = MALLOC ( 36 )...CALL FREE ( P1 )...
上記の例では
例 4 : 記憶領域とそのアドレスの獲得MALLOC()で 36 バイトの記憶領域を獲得し、他の命令をいくつか実行し、おそらくこの一連の記憶領域を使用する命令をいくつか実行した後、この 36 バイトをメモリーマネージャに戻すようにFREE()に指示します。
POINTER ( P, V )CHARACTER V*12, Z*1P = MALLOC( 12 )...END
上記の例では関数
例 5 : 配列の動的割り当てMALLOC()で 12 バイトの記憶領域を獲得し、その記憶領域のアドレスをポインタPに割り当てます。
この例は今までの例と異なり、やや現実的な形式をとっています。大きさは、たとえば
例 6 : ポインタを使用して、
10,000 のように非常に大きな数値をとることができます。サブルーチンは、一度配列が割り当てられてしまうと、それが動的に割り当てられたことを知らずに動作します。f77でリンクリストを作成する
demo%f77 -silent Linked.f"Linked.f", line 6: 警告: 局所変数"b" が使用されていません。"Linked.f", line 31: 警告: 局所変数"b" が使用されていません。demo%a.out1 aaa2 bbb3 ccc4 ddddemo%
パラメータ
説明
f
書式識別子
iolist
変数、部分列、配列、記録の並び
grname
変数群の名前
説明
書式識別子
- 並びによる入出力を示すアスタリスク(*)。詳細については、「並びによる入出力」を参照してください。
- 同一プログラム単位内に出現する
FORMAT文の文番号。- 同一プログラム単位内に出現する
FORMAT文の文番号を割り当てられた整変数名。- 書式文字列を指定する文字式または整数配列。整数配列は規格外です。©
出力並び
iolist は、空の場合と、出力並びと
DO型並びの両方または一方を含む場合があります。出力並びは以下のいずれかです。添字なしで単に配列名だけを書けば、記憶領域へ格納されている順に (左端の添字が他より速く増加する) 配列の全要素が指定されます。
DO 型並びの詳細については、「DO 型並び」を参照してください。
変数群
NAMELIST文で先に定義されている変数群の名前です。1. 書式が指定されていればそれが確立されます。2. 出力並びが空でなければその並びから標準出力へデータが転送されます。
- 書式が指定されているとそれに応じてデータが編集されます。
3.制限事項
例外ハンドラからの出力は予測できません。ユーザー自身の例外ハンドラを作成する場合、そのハンドラから Fortran 77 出力を行わないでください。どうしても必要な場合は、出力直後に異常終了を呼び出します。こうすることによって、システムが凍結する危険を減らすことができます。例外ハンドラからの Fortran 77 入出力は再帰的な入出力です。次の段落を参照してください。
再帰的な入出力の動作は信頼できません。入出力リスト中に関数をリストして、その関数が 入出力を行う場合、実行時に実行が凍結するか、その他にも予測できない問題が発生する可能性があります。この危険は並列化に関わらず存在します。
例
例 1 : 書式付きスカラー
CHARACTER TEXT*16PRINT 1, NODE, TEXT1 FORMAT ( I2, A16 )
例 2 : 並びによる配列
PRINT *, I, J, ( VECTOR(I), I = 1, 5 )
例 3 : 書式付き配列
INTEGER VECTOR(10)PRINT '( 12 I2 )', I, J, VECTOR
例 4 : 変数群
CHARACTER LABEL*16REAL QUANTITYINTEGER NODENAMELIST /SUMMARY/ LABEL, QUANTITY, NODEPRINT SUMMARY
PROGRAM
PROGRAM文は、プログラム単位を主プログラムとして識別します。
パラメータ
説明
pgm
主プログラムの英字名
PROGRAMpgm説明
ローダーにとって主プログラムの名前は常に
制限事項MAINです。PROGRAM文はプログラムを読む人だけに役立つものです。
PROGRAM文は主プログラムの最初の文としてのみ使用できます。プログラムの名前は主プログラムでの局所名と同じにすることができます。© FORTRAN 77 規格ではこれができません。
例
PROGRAM US_ECONOMYNVARS = 2NEQS = 2...
READ
READ文はファイルまたはキーボードから並びの項目へデータを読み取ります。
注 - テープ装置からデータを読み取る場合は、TOPEN()ルーチンを使用します。『Fortran ライブラリ・リファレンス』を参照してください。
READ([UNIT=] u [,[FMT=]f] [, IOSTAT=ios] [, REC=rn] [, END= s]
[, ERR=s]) iolistREAD([UNIT=] u, [NML=] grname [,IOSTAT=ios] [,END=s] [,ERR=s] )
パラメータ
説明
u
ファイルに結合された装置の装置識別子
f
書式識別
ios
入出力状態指定子
rn
読み取られる記録番号
s
ファイル処理終了のための文番号
iolist
変数の並び
grname
変数群の名前
説明
UNIT=u,REC=rn の代替形式は以下のとおりです。©
装置識別子
装置指定子で省略可能な文字
UNIT=を省略する場合は、u を指定子の並びの最初の項目としなければなりません。書式識別子
- アスタリスク (
*) − 並びによる入出力を示します。詳細については、「並びによる入出力」を参照してください。- 同一プログラム単位内に出現する
FORMAT文の文番号- 同一プログラム単位内に出現する
FORMAT文の文番号を割り当てられている整変数名- 書式文字列を指定する文字式または整数配列。実行時書式または変数書式といいます。整数配列は規格外です。©
実行時に評価される書式の詳細については、「実行時書式」を参照してください。
書式指定子で省略可能な文字
FMT=を省略する場合、f は書式付き読み取りの第 2 の引数として現れるか、全く現れないかのどちらかでなければなりません。内部ファイルと端末ファイルから書式なしデータを転送することはできません。したがってこのようなファイルにとっては f が不可欠です。
直接探査ファイルと内部ファイルから並びによるデータを転送することができます。したがってこのようなファイルの場合、f をアスタリスクにします。©
ファイルが書式付き入出力に結合される場合、書式なしデータを転送することはできません。同様に、ファイルが書式なし入出力に結合されている場合は書式付きデータを転送することはできません。
入出力状態指定子
記録番号
rn は正の整数式で、直接探査ファイルに限り使用できます。rn は内部ファイルに指定することもできます。©
ファイル終了指定子
s は
READ文のあるプログラム単位内の実行文の文番号です。
END=s とREC=rn の各指定子はREAD文で同時に指定できます。©誤り指定子
s は
READ文のあるプログラム単位内の実行文の文番号です。入力並び
iolist は空の場合と、入力並びと
DO型並びの両方または一方を含む場合があります。入力並びは以下のいずれかです。添字なしで単に配列名だけを書くと、記憶領域に格納されている順に (左端の添字が他より速く増加する) 配列の全要素が指定されます。
DO 型並びの詳細については、「DO 型並び」を参照してください。
変数群
READ
READ文の第 3 と第 4 の形式は、指定された変数群の項目を読み取るために使用されます。grname は先にNAMELIST文で定義されている変数群の名前です。実行
1. 指定された装置にファイルが結合されます。
- 書式が指定されていればそれが確立されます。データの転送に先立ちファイルが適切に位置付けされます。
2. 入力並びが空でない場合、ファイルから対応する並びの項目へデータが転送されます。
- 入力並びがなくなるまで項目が順に処理されます。次の指定項目が決定され、読み取られた値がそれに転送されます。書式付き
READでのデータ編集は指定された書式に従って行われます。3. 変数群READの第 3 と第 4 の形式では、指定された変数群の項目が変数群入力の規則に従って処理されます。4. データ転送後、ファイルが適切に再び位置付けされます。5. ios が指定されている場合、誤りが生じなければ ios はゼロに設定されます。
- 誤りまたはファイルの終了になった場合は正の値に設定されます。
6. s が指定されている場合、ファイルが終了すると制御が s に移されます。7. s が指定されている場合、誤りが生じると制御が s に移されます。
READf[,iolist]
READ [ NML= ] grname
上記の 2 つの形式は、キーボードから読み取られることを除き、他と同じように動作します。
- 入力並びがなくなると入力した行の次行の先頭にカーソルが移動します。空の入力並びの場合は、入力した行の次行の先頭にカーソルが移動します。
- 入力並びが満たされる前に、行の終わり、
CR、NLのいずれかに到達した場合は次行へ入力が続行します。- 入力並びが満たされる前にファイル終了 (Control
-D) を受け取った場合は入力を中止し、入力並びの未処理の項目はそのままとなります。u がファイルに結合されていない外部装置を指定した場合は暗黙の
OPEN操作が実行され、下記の例のオプションでファイルを開いた場合と同じ状態になります。
OPEN(u, FILE='FORT.u', STATUS='OLD',ACCESS='SEQUENTIAL',
&
FORM=fmt )
例
- fmt の値は、読み取りが書式付きか否かにより
'FORMATTED' または 'UNFORMATTED' となります。- 添字なしで単に配列名だけを書くと、記憶領域に格納されている順 (左端の添字が他より速く増加する) 配列の全要素が指定されます。
- まだ書き込まれていない直接探査ファイルの記録を読み取ろうとすると、入力並び項目がすべて未定義になります。
- 記録番号は 1 から始まります。
- 変数群入力ができるのは順番探査ファイルだけです。
例 1 : 書式付きREAD、入出力誤りのトラップ、ファイル終了、入出力状態
READ( 1, 2, ERR=8, END=9, IOSTAT=N ) X, Y...8 WRITE( *, * ) '1 での入出力エラー番号:', NSTOP9 WRITE( *, * ) '1 で EoF'RETURNEND
例 2 : 直接、書式なしREAD、入出力エラートラップ、入出力状態
READ( 1, REC=3, IOSTAT=N, ERR=8 ) V...4 CONTINUERETURN8 WRITE( *, * ) '1 での入出力エラー番号:', NEND
例 3 : キーボードからの並びによるREAD
READ( *, * ) A, VまたはREAD *, A, V
例 4 : 内部ファイルからの書式付きREAD
CHARACTER CA*16 / 'abcdefghijklmnop' /, L*8, R*8READ( CA, 1 ) L, R1 FORMAT( 2 A8 )
例 5 : 配列全体の読み取り
DIMENSION V(5)READ( 3, '(5F4.1)') V
例 6 : 変数群READ
CHARACTER SAMPLE*16LOGICAL NEW*4REAL DELTA*4NAMELIST /G/ SAMPLE, NEW, DELTA...READ( 1, G )またはREAD( UNIT=1, NML=G )またはREAD( 1, NML=G )
REAL
REAL文は定数名、変数、配列、関数、仮関数の型を実数に指定します。また、REAL文で配列の次元と大きさを指定したり、初期値を与えることもできます。
REAL [*len[,]]v[ *len[/c/]] [,v [*len[/c/]] ...
パラメータ
説明
v
変数、定数名、配列、配列宣言子、関数、仮関数の名前
len
4、8、16 (SPARC のみ) のどれかで、定数名、変数、配列要素または関数の長さをバイト数で表したもの
c
この前にくる名前の定数の並び
説明
REAL、REAL*4、REAL*8、REAL*16について説明します。
REAL
REAL Wのように宣言すると、通常、変数WはメモリーのREAL*4型の要素で、実数と解釈されます。 サイズの指定は規格外になります。 ©
REAL Hなどの宣言のデフォルトサイズを変更するには、オプション-dbl、-r8、または-xtypemapのいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。
REAL*4©
REAL*4 Wのように宣言すると、変数Wは常にメモリーのREAL*4型の要素で、単長の実数と解釈されます。
REAL*8©
REAL*8 Wのように宣言すると、変数Wは常にメモリーのREAL*8型の要素で、倍長の実数と解釈されます。
REAL*16©(SPARC のみ)
例REAL*16 Wのように宣言すると、変数Wは常にメモリー内のREAL*16型の要素で、4 倍長の実数と解釈されます。
例 1 : 単純な実数変数 -- 以下の宣言は、すべて等価です。
REAL U, V(9)REAL*4 U, V(9)REAL U*4, V(9)*4
例 2 : 変数の初期化 (REAL*16は SPARC のみ)
REAL U/ 1.0 /, V/ 4.3 /, D*8/ 1.0 /, Q*16/ 4.5 /
例 3 : 実数の配列の寸法を指定
REAL A(10,100), V(10)REAL X*4(10), Y(10)*4
例 4 : 配列の初期化
REAL A(10,100) / 1000 * 0.0 /, B(2,2) / 1.0, 2.0, 3.0, 4.0 /
例 5 : 倍精度と 4 倍精度
(
REAL*8 RREAL*16 QDOUBLE PRECISION DREAL*16は SPARC のみ)
RECORD
RECORD© 文は指定された構造体を持つ変数を定義したり、指定された構造体を持つ変数の配列を定義します。
パラメータ
説明
構造体名
先に宣言されている構造体の名前
記録の並び
変数、配列、または配列宣言子
RECORD /構造体名/ 記録の並び [,/構造体名/ 記録の並び]... 説明
構造体は記録のひな形です。構造体の名前は
STRUCTURE文にあり、STRUCTURE文で一度定義され命名された構造体は、RECORD文で使用することができます。記録は変数または配列を一般化したものです。変数や配列が型を持つように、記録は構造体を持ちます。配列の要素はすべて同じ型でなければなりませんが、記録欄の型は異なっていてもかまいません。
RECORD行は本来複数行に渡る文の集合の一部であり、RECORD行とENDRECORD行のどちらも継続行はありません。6 桁目に空白以外の文字を入れたり、1 桁目に&を入れたりしないでください。構造体、フィールド、記録については、「構造体」を参照してください。
制限事項
例
- 各記録はメモリー内に別々に割り当てられます。
- 最初、記録の値は定義されていません。
- 記録、記録欄、記録配列、記録配列の要素は、引数または仮引数として使用することができます。記録を引数として渡す場合、その記録欄の型、順序、寸法は同じでなければなりません。呼び出し先と呼び出し元の記録の宣言は一致していなければなりません。
- 共用体の宣言においては、マップ欄はどのような順番でもかまいません。
- 記録欄は
COMMON文で指定できます。- 記録と記録欄は
DATA文、EQUIVALENCE、NAMELIST、PARAMETER、AUTOMATIC、STATIC、SAVEの文では指定できません。記録と記録欄の初期化にはSTRUCTURE文を使用します。詳細については、「STRUCTURE」を参照してください。
例 1 : 指定した構造体の記録として複数の項目を宣言
STRUCTURE /PRODUCT/INTEGER*4 IDCHARACTER*16 NAMECHARACTER*8 MODELREAL*4 COSTREAL*4 PRICEEND STRUCTURERECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)...
例 2 : 記録の複数の欄を定義し、使用する
CURRENT、PRIOR、NEXTの各変数はPRODUCTという構造体を持つ記録です。LINEはPRODUCTという構造体を持つ記録を 10 個含む配列です。
82CacheBoard1000.0096K
RETURN
RETURN文は呼び出し元のプログラム単位に制御を返します。
パラメータ
説明
e
INTEGER 型または REAL 型の式
説明
RETURN文を実行すると関数またはサブルーチンの引用が終了します。関数またはサブルーチンで
END文を実行するとRETURN文を実行するのと同じ結果になります。©e という式は評価され、必要であれば整数に変換されます。e は使用する選択戻り文番号の順序を表します。選択戻り文番号は
SUBROUTINE文ではアスタリスク (またはアンパサンド ) © で指定されます。e が指定されていない場合、また e が 1 より小さいか
RETURN文を含むSUBROUTINE文で指定されたアスタリスクまたはアンパサンドの数より大きい場合、制御はサブルーチンを呼び出したCALL文の次の文に戻ります。e の値が 1 以上で
例SUBROUTINE文で指定されたアスタリスク (またはアンパサンド) の数以下である場合、制御は e 番目の選択戻り文番号で識別される文に戻ります。RETURN文は関数の副プログラムまたはサブルーチンにしか使用できません。
例 1 : 標準的な戻り
CHARACTER*25 TEXTTEXT = "Some kind of minor catastrophe"...CALL OOPS ( TEXT )STOPENDSUBROUTINE OOPS ( S )CHARACTER S* 32WRITE (*,*) SRETURNEND
例 2 : 選択戻り
REWIND
REWIND文は指定された装置に結合されたファイルをその始点に位置付けます。
注 - テープ装置をまき戻す場合は、TOPEN()ルーチンを使用します。『Fortran ライブラリ・リファレンス』を参照してください。
REWIND ( [ UNIT=]u[, IOSTAT=ios] [, ERR=s])
パラメータ
説明
u
ファイルに結合された外部装置の装置識別子。順番探査または追加探査の際には u が結合されていること。
ios
入出力状態指定子。整変数または整数配列要素。
s
誤り指定子。s は REWIND文のあるプログラム内の実行文の文番号であること。REWIND文の実行中にエラーが生じた場合、プログラムの制御はこの文番号に移される。
説明
ファイルが結合されていない装置に
REWIND文を実行しても何も起こりません。端末ファイルで
REWIND文を実行しても何も起こりません。直接探査ファイル上での
例REWIND文の使用は FORTRAN 77 規格では定義されておらず、その動作は予測できません。
例 1 : 単純な形式の装置指定子
ENDFILE 3REWIND 3READ (3,'(I2)') IREWIND 3READ (3,'(I2)')I
例 2 :UNIT=u という形式の装置指定子とエラートラップを持つREWIND文
INTEGER CODE...REWIND (UNIT = 3)REWIND (UNIT = 3, IOSTAT = CODE, ERR = 100)...100 WRITE (*,*) '巻き戻し中のエラー'STOP
SAVE
SAVE文では、RETURN文またはEND文の実行後に副プログラム内の項目を保存することによって、未定義にならないようにします。
パラメータ
説明
v
副プログラム内の配列、変数、(スラッシュで囲まれた) 共通ブロックの名前
SAVE [v[,v] ... ]説明
保存する変数は内部の静的領域に格納されます。すべての共通ブロックは、静的領域に割り当てられているため、すでに保存されています。したがって、
SAVE文で共通ブロック名を指定することは可能ですが、無視されます。
SAVE文は主プログラムに指定する必要はなく、指定しても何の効果もありません。
SAVE文に何も指定しない場合、ルーチン内の局所変数と配列がすべて保存されます。局所変数と配列はデフォルトですでに静的であるため、
制限事項SAVEする必要はありません。しかし、SAVEを使用すれば、特にRETURN以外の方法で副プログラムを出るルーチンでは、移植性が保証されます。
例
SUBROUTINE FFA(N)DIMENSION A(1000,1000), V(1000)SAVE A...RETURNEND文関数
文関数の定義文は関数に似た、1 つの文だけからなる宣言です。
パラメータ
説明
fun
定義する文関数の名前
d
文関数の仮引数
e
式。e の型は算術、論理、文字のどれでもよい
fun ( [ d [, d ] ... ] ) = e 説明
ROOT( A, B, C ) = (-B + SQRT(B**2-4.0*A*C))/(2.0*A)
文関数を引用するには、引数を持つ文関数の名前を式のオペランドとして使用します。
1. 実引数が式である場合、実引数が評価されます。2. 実引数が対応する仮引数に関連付けられます。3. 文関数の本体である式 e が評価されます。4. 3. の結果の型が関数名の型と異なる場合、結果の型が変換されます。5. 値が返されます。これにより、関数を引用した式が結果の値を使用できるようになります。
制限事項
例
- 文関数は宣言文の後で、その文関数が引用されるプログラム単位の最初の実行文の前になければなりません。
- 文関数は指定された箇所では実行されません。他の関数と同じように、式の中で関数の引用が実行されるときに実行されます。
- fun と e 間の一致に関する規則は、代入文に関する規則と同じです。fun と e の型は同じである必要はありませんが、同じでない場合には e が fun と同じ型に変換されます。
- 実引数は対応する仮引数と順序、個数、型が一致しなければなりません。
- 仮引数を構造体として定義した場合は、対応する実引数も同じ構造体として定義する必要があります。
- 仮引数を配列名または関数名にすることはできません。関数と同じ名前にすることもできません。
- 同じ引数を複数回指定することはできません。
- 文関数はその文関数を含むプログラム単位内でしか引用できません。
- 文関数の名前は実引数としては指定できません。また、
EXTERNAL文で指定することもできません。- 引数の型は文関数が 1 つのプログラム単位であるかのように決められます。
- 文関数の引数の名前と同じ名前の局所変数があっても、その名前の引用は文関数の仮引数の引用として扱われます。局所変数の引用としては扱われません。
- 文字型の文関数の長さ指定や、その
CHARACTER型の仮引数は整定数式でなければなりません。- 文関数は再帰的に呼び出すことはできません。
例 1 : 算術文関数
PARAMETER ( PI=3.14159 )REAL RADIUS, VOLUMESPHERE ( R ) = 4.0 * PI * (R**3) / 3.0READ *, RADIUSVOLUME = SPHERE( RADIUS )...
例 2 : 論理文関数
LOGICAL OKFILEINTEGER STATUSOKFILE ( I ) = I .LT. 1READ( *, *, IOSTAT=STATUS ) X, YIF ( OK FILE(STATUS) ) CALL CALC ( X, Y, A )...
例 3 : 文字文関数
CHARACTER FIRST*1, STR*16, S*1FIRST(S) = S(1:1)READ( *, * ) STRIF ( FIRST(STR) .LT. " " ) CALL CONTROL ( S, A )...
STATIC
STATIC© 文は指定した項目が必ず静的領域に格納されるようにします。
パラメータ
説明
list
変数と配列の並び
STATIClist 説明
すべての局所変数と配列は、デフォルトでは静的であると分類されます。各データのコピーは 1 つだけ存在し、呼び出しと呼び出しの間でもその値は保持されます。
STATIC文またはAUTOMATIC文を使用して変数を明示的に静的変数または自動変数に定義することもできます。また型宣言文またはIMPLICIT文でも定義できます。しかし、移植性を保証するために
STATICを使用することができます。特に、RETURN以外の方法で副プログラムを出るルーチンではSTATIC文が有効です。例
- 引数と関数値は自動です。
STATIC文と型宣言文を組み合わせてSTATIC型宣言文にすることはできません。たとえば、STATIC REAL Xという文は変数XがSTATICでありREALであると宣言しているのではなく、変数REALXがSTATICであると宣言しています。
STATIC A, B, CREAL P, D, QSTATIC P, D, QIMPLICIT STATIC (X-Z)
STOP
パラメータ
説明
str
5 桁以下の文字列または文字定数
STOP [str]説明
例
例 1 : 整数
stop 9
例 2 : 文字
STOP: 9
stop 'エラー'
STOP: エラー説明
STRUCTURE
STRUCTURE文は、記録を構成する欄の名前、型、サイズ、順序を指定することによって記録の形式を定義します。また、必要に応じて初期値を指定することもできます。構造体は記録用のテンプレートです。構造体の名前は
STRUCTURE文で定義され、このように一度STRUCTURE文で定義されて名付けられた構造体はRECORD文で使用することができます。記録は変数または配列を一般化したものです。変数や配列が型を持つように、記録は構造体を持ちます。配列の要素はすべて同じ型でなければなりませんが、記録の欄の型は異なっていてもかまいません。
構造体、欄、および記録については、「構造体」を参照してください。
制限事項
構造体の名前はスラッシュで囲みます。名前を省略できるのは入れ子にされた構造体だけです。
各構造体名は構造体間で一意でなければなりません。ただし、構造体名を他の構造体内の欄の名前として使用したり、変数名として使用することはできます。
欄に関する制限事項
STRUCTURE文とENDSTRUCTURE文の間に入れることのできる文は欄宣言文とPARAMETER文だけです。構造体宣言ブロック内のPARAMETER文はその外側にあるPARAMETER文と同じです。
欄宣言が型宣言の場合、通常の Fortran 77 の型宣言文と同じ構文を使用します。ここでは以下のような規則と制限に従えば、
f77のすべての型が許されます。
- 寸法の指定が必要であれば、それを型宣言文の中に含めなければなりません。
DIMENSION文は欄名には影響しません。- 欄名には
%FILLという疑似名を指定することができます。%FILLはFortran 77 の他バージョンとの互換性を保つために提供されています。f77では整列の問題が解消されているため、%FILLは必要ありません。%FILLは、1 つまたは複数の欄を特定のサブルーチンで引用できないようにするときに便利です。%FILLを指定した場合、指定された大きさと型の欄が提供されるだけで、それを引用することはできません。- 欄名はすべて明示的に型宣言しなければなりません。
STRUCTURE宣言内の文には、IMPLICIT文も暗黙のI、J、K、L、M、Nの規則も適用されません。- 欄宣言では整合配列や大きさ引き継ぎ配列を使用することはできません。また、長さが引数として渡される
CHARACTER宣言も使用することはできません。構造体宣言では、欄のオフセット n はその前の欄のオフセットに前の欄の長さを足したもので、整列させるために調整されることもあります。
変数、配列、部分列、部分構造体、共用体である欄は初期化することができます。
例
例 1 : 5 つの欄からなる構造体
STRUCTURE /PRODUCT/INTEGER*4 ID / 99 /CHARACTER*16 NAMECHARACTER*8 MODEL / 'Z' /REAL*4 COSTREAL*4 PRICEEND STRUCTURERECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
上記の例では、5 つの欄
例 2 : 2 つの欄からなる構造体ID、NAME、MODEL、COST、PRICEからなるPRODUCTという名前の構造体が定義されています。変数CURRENT、PRIOR、NEXTはそれぞれPRODUCT構造体を持つ記録で、LINEはこのような記録を 10 個含む配列です。これらの記録のIDには 99、MODELにはZという初期値が設定されます。
STRUCTURE /VARLENSTR/INTEGER*4 NBYTESCHARACTER A*25END STRUCTURERECORD /VARLENSTR/ VLSVLS.NBYTES = 0
SUBROUTINE
SUBROUTINE文は指定したプログラム単位をサブルーチンと識別し、その引数を指定します。
パラメータ
説明
sub
副プログラムの名前
d
変数名、配列名、記録名、仮手続き名、アスタリスク、アンパサンドのいずれか
SUBROUTINEsub [ ( [ d [, d ] ... ])] 説明
副プログラムの最初の文は
SUBROUTINE文でなければなりません。サブルーチンには、BLOCK DATA、FUNCTION、PROGRAM、および別のSUBROUTINE文を書くことはできません。sub はサブルーチン名で、大域名ですが、共通ブロック名や関数名といった他の大域名と同じであってはなりません。また、同じサブルーチン内の局所名と同じであってもなりません。
d は仮引数です。仮引数が複数あるときにはそれぞれをコンマで区切ります。d は以下のうちのどれかです。
仮引数はサブルーチンに対し局所的です。また、共通ブロック名以外として以下の文に現れることはできません。
サブルーチンを引用する
CALL文の実引数は、SUBROUTINE文の対応する仮引数の順序、数、型と一致しなければなりません。仮引数の並びのアスタリスク (またはアンパサンド) は選択戻り文番号を示します。どの選択戻り文を取るかはサブルーチン内の
例RETURN文で指定できます。
例 1 : 仮引数としての変数と配列
SUBROUTINE SHR ( A, B )CHARACTER A*8REAL B(10,10)...RETURNEND
例 2 : 規格に従った選択戻り
この例の
RETURN 1文は 最初の選択戻り文番号 (最初の*) を引用し、RETURN 2文はSUBROUTINE文で指定された 2 番目の選択戻り文番号 (2 番目の*) を引用します。
TYPE
パラメータ
説明
f
書式識別子
iolist
変数、部分列、配列、記録の並び
grname
変数群の名前
説明
例
TYPE文は、互換性を保つために提供されており、以下は同じ働きをします。
例 1 : 書式付き出力と変数群出力
INTEGER V(5)REAL X(9), YNAMELIST /GNAM/ X, Y...TYPE 1, V1 FORMAT( 5 I3 )...TYPE GNAM...
型宣言文
型宣言文は並びの各項目のデータ型を指定します。また、型宣言文で配列の形状を指定したり、初期値を与えることもできます。
型 v [/ clist /] [,v [/ clist /]...型の前に
説明AUTOMATIC文またはSTATIC文が入ることもあります。
- デフォルト、または
IMPLICIT文によって設定された型を変更したり、その型と同じ型を宣言することができる。- 配列の形状を指定することができる。また、型宣言文は組み込み関数の型を確定するのにも使用できる。
- データ型の長さを別の有効な長さに変えることができる。
DATA文で行うように型宣言に定数の並び (clist) を指定すると、変数、配列、記録欄に初期値を設定することができます。©
または 型 配列名 / 定数, ... / または 型 配列名 / r*定数 /
CHARACTER LABEL*12 / 'Standard' /COMPLEX STRESSPT / ( 0.0, 1.0 ) /INTEGER COUNT / 99 /, Z / 1 /REAL PRICE / 0.0 /, COST / 0.0 /REAL LIST(8) / 0.0, 6*1.0, 0.0 /
- 単純な変数には定数を 1 つだけ指定できます。
- 配列の要素を 1 つでも初期化する場合は、残り全部も初期化しなければなりません。
- 整数の後にアスタリスク (
*) と定数を続けて、反復因子として指定することができます (上記の例では 1.0 という値が 6 個、LISTの配列要素 2、3、4、5、6、7 にそれぞれ格納されます)。AUTOMATICと宣言された変数、または配列を初期化することはできません。- ポインタ基底付き変数またはポインタ基底付き配列を初期化することはできません。次に例を示します。
INTEGER Z / 4 /POINTER ( x, Z ) 警告が出され、初期化は行われない上記の場合、コンパイラは警告メッセージを発し、
Zは初期化されません。変数または配列が初期化されない場合、その値は未定義になります。
初期化の文が共通ブロックの変数に指定されている場合、
-ansiコンパイラフラグが設定されていると、警告メッセージが出力されます。
注 - オプション-dbl、-r8、-i2、または-xtypemapのいずれかを指定してコンパイルすると、明示的なサイズなしで型宣言された名前のデフォルトサイズを変更できます。第 2 章「データ型とデータ項目」を参照してください。
制限事項
1 つのプログラム単位内にある型宣言文で同じ英字名を複数回指定することはできません。
例
INTEGER*2 I, J/0/REAL*4 PI/3.141592654/,ARRAY(10)/5*0.0,5*1.0/CHARACTER*10 NAMECHARACTER*10 TITLE/'Heading'/
Jは0に初期化されます。PIは3.141592654に初期化されます。ARRAYの最初の 5 つの要素は0.0に初期化されます。- 次の 5 つの要素は
1.0に初期化されます。TITLEは'Heading' に初期化されます。
UNION と MAP
UNION© 文は実行時にメモリーを共有する欄のグループを定義します。
説明
UNIONMAP欄宣言欄宣言...
ENDMAPMAP欄宣言欄宣言...END MAPEND UNION
MAP文は共用体内に代替の欄グループを定義します。実行時には 1 つのマップだけが共有の記憶場所と関連付けられます。マップ内の欄を引用すると、それまでのマップの欄グループは未定義になり、新しく引用された欄のマップ内の欄グループが記憶場所を引き継ぎます。
UNION宣言は、STRUCTURE宣言の中だけで行うことができます。- 共用体が使用するメモリー量は、その最大マップで使用するメモリー量です。
UNION宣言内のMAP文は、どのような順番でもかまいません。例
UNION行は本来複数行の文の集合の一部であり、UNION行またはENDUNION行のどちらも継続行はありません。6 桁目に空白以外の文字を入れたり、1 桁目に&を入れたりしないでください。
/STUDENT/という構造体がNAME、CLASS、MAJORまたはNAME、CLASS、CREDIT、GRAD_DATEのどちらかを含むように宣言しています。
STRUCTURE /STUDENT/CHARACTER*32 NAMEINTEGER*2 CLASSUNIONMAPCHARACTER*16 MAJOREND MAPMAPINTEGER*2 CREDITSCHARACTER*8 GRAD_DATEEND MAPEND UNIONEND STRUCTURERECORD /STUDENT/ PERSON上記の例では、変数
PERSONは構造体/STUDENT/を持つため下記のことが言えます。
PERSON.MAJORは最初のマップの欄を引用し、PERSON.CREDITSは 2 番目のマップの欄を引用します。- 最初のマップの欄の変数が初期化された後にプログラムが変数
PERSON.MAJORを引用した場合、最初のマップが有効になり、2 番目のマップの各変数は未定義になります。
VIRTUAL
VIRTUAL© 文はDIMENSION文と同じように扱われます。VIRTUAL a ( d ) [, a ( d ) ] ...
パラメータ
説明
a
配列名
a(d)
配列の次元。1 個から 7 個までの宣言子をコンマで区切って指定する。
説明
例
VIRTUAL文は形式も働きもDIMENSION文と同じです。VIRTUAL文はFortran77 の旧バージョンとの互換性を保つためにあります。
VIRTUAL M(4,4), V(1000)...END
VOLATILE
VOLATILE© 文は特定の項目に対して最適化が行われないようにします。
パラメータ
説明
nlist
変数、配列、共通ブロックの並び
VOLATILEnlist 説明
例
VOLATILE文は指定された並びの項目に対して最適化が行われないようにします。VOLATILE文に動作が左右されるプログラムは、普通は移植できません。
PROGRAM FFTINTEGER NODE*2, NSTEPS*2REAL DELTA, MAT(10,10), V(1000), X, ZCOMMON /INI/ NODE, DELTA, V...VOLATILE V, Z, MAT, /INI/...EQUIVALENCE ( X, V )...上記の例では、配列
V、変数Z、共通ブロック/INI/はVOLATILEであると明示的に指定されます。変数Xは、EQUIVALENCEを通してVOLATILEであると指定されます。
WRITE
WRITE文は出力並びからファイルにデータを書き込みます。
注 - テープ入出力の場合、TOPEN() ルーチンを使用します。
WRITE( [ UNIT=]u[, [FMT=]f] [, IOSTAT=ios] [, REC=rn]
WRITE( [ UNIT= ]u, [ NML= ]grname[, IOSTAT=ios] [, ERR=s] )
パラメータ
説明
u
ファイルに結合された装置の装置識別子
f
書式識別子
ios
入出力状態識別子
rn
記録番号
s
誤り指定子 (文番号)
iolist
変数の並び
grname
変数群の名前
REC=rn という形式の代わりに次のように書くこともできます。©
WRITE(u'rn... )iolist ©「例」の例 3 は、この形式の例も兼ねています。
説明
テープ上のファイルに対しては
、TOPEN()ルーチンを使用する方が確実です。装置識別子
装置指定子から 省略可能な
UNIT=を省略する場合、指定子の並びの中では u を最初の項目に指定しなければなりません。書式識別子
- アスタリスク (
*)。並びによる入出力を示します。詳細については、「並びによる入出力」を参照してください。- 同じプログラム単位内にある
FORMAT文の文番号。- 同じプログラム単位内にある
FORMAT文の文番号が割り当てられている整変数の名前。- 書式文字列を指定する文字式または整数の配列。これは実行時書式または変数書式と呼ばれます。整数の配列は規格外です。©
実行時に評価される書式の詳細については、「実行時書式」を参照してください。
書式識別子から省略可能な
FMT=を省略する場合、f は書式付きWRITE文の 2 番目の引数に指定しなければなりません。他の場合に f を指定することはできません。f は直接探査のときは、アスタリスクにすることはできません。
f は内部ファイルのとき、アスタリスクにすることができます。©
ファイルが書式付き入出力に結合されている場合、書式なしのデータは転送できません。逆に、ファイルが書式なし入出力に結合されている場合は、書式付きのデータは転送できません。
入出力状態指定子
ios は整変数、整数配列要素、整数の記録欄のいずれかでなければなりません。
記録番号
rn は正の整数式でなければなりません。この引数は直接探査ファイルにだけ使用できます。rn は内部ファイルに対しても指定できます。©
エラー指定子
s は
WRITE文があるプログラム単位内の実行文の文番号でなければなりません。出力並び
iolist には、何も指定しないことも、出力並びの項目と
DO型並びのどちらかまたは両方を指定することもできます。出力並びの項目には以下のものがあります。添字が指定されていない単純な配列名は、配列のすべての要素をメモリーに格納されている順に指定します。このとき添字は左の方が他より速く増加します。
DO 型並びの詳細については、「DO 型並び」を参照してください。
出力並び項目が連結演算子を使用した文字式である場合、そのオペランドの長さ指定子にアスタリスク (
*) を指定することもできます。これは規格外です。©出力並びにある関数は、入出力文を実行するものであってはなりません。
変数群を指定した
WRITE
WRITE文のもう 1 つの形式は、指定された変数群の項目を出力するために使用されます。この grname はNAMELIST文で、すでに定義された変数群の名前です。実行
1. 指定された装置に結合するファイルを決めます。
- 書式が指定されている場合はその書式が設定されます。ファイルはデータ転送前に適切な場所に位置付けられます。
2. 出力並びが空でない場合、データは出力並びからファイルに転送されます。
- 書式が指定されている場合は書式に合わせてデータが編集されます。
3. 変数群が指定されたWRITEの 2 つ目の構文では、データは変数群出力に関する規則に従って指定された変数群の項目から転送されます。4. ファイルはデータ転送後、再び適切な場所に位置付けられます。5. ios が指定されている場合、エラーが生じなければ ios はゼロに設定されます。エラーが生じれば、ios は正の値に設定されます。6. s が指定されている場合にエラーが生じると制御は s に渡されます。制限事項
- 例外ハンドラからの出力は予測できません。
- ユーザー自身の例外ハンドラを作成する場合、そのハンドラから Fortran 77 出力を行わないでください。どうしても必要な場合は、出力直後に
ABORTを呼び出します。こうすることによって、システムが凍結する危険を減らすことができます。例外ハンドラからの Fortran 77 入出力は再帰的な入出力です。次の段落を参照してください。
- 再帰的な入出力の動作は信頼できません。
- 入出力リスト中に関数をリストして、その関数が入出力を行う場合、実行時に実行が凍結するか、その他にも予測できない問題が発生する可能性があります。この危険は並列化に関わらず存在します。
注釈
PRINT *, x, f(x) f() が入出力を行なうため、使用できない。ENDFUNCTION F(X)WRITE(*,*) XRETURNEND
u がファイルに結合されていない外部装置を指定する場合、ファイルを開くための
OPEN操作が暗黙的に実行されます。この操作は以下のようにオプションを指定してファイルを開くのと同等です。
OPEN( u, FILE ='FORT.u', STATUS ='UNKNOWN',& ACCESS='SEQUENTIAL', FORM= fmt )fmt の値は書式付きの場合は
'FORMATTED' で、指定なしの場合は'UNFORMATTED' です。添字が指定されていない単純な配列名は、配列のすべての要素をメモリーに格納されている順に指定します。このとき添字は左の方が他より速く増加します。
例
例 1 : 書式付きWRITE、入出力エラートラップと入出力状態あり
WRITE( 1, 2, ERR=8, IOSTAT=N ) X, YRETURN...8 WRITE( *, * ) '1 における入出力エラー番号: ', NSTOPEND
例 2 : 直接、書式なしWRITE、入出力エラートラップと入出力状態あり
...WRITE( 1, REC=3, IOSTAT=N, ERR=8 ) V...4 CONTINUERETURN8 WRITE( *, * ) '1 における入出力エラー番号: ', NEND
例 3 : 直接、代替構文 (上記の例と同等) ©
...WRITE( 1 ' 3, IOSTAT=N, ERR=8 ) V ©...4 CONTINUERETURN8 WRITE( *, * ) '1 における入出力エラー番号: ', NEND
例 4 : 画面への並びによるWRITE
WRITE( *, * ) A, VまたはPRINT *, A, V
例 5 : 内部ファイルへの書式付きWRITE
CHARACTER CA*16, L*8 /'abcdefgh'/, R*8 /'ijklmnop'/WRITE( CA, 1 ) L, R1 FORMAT( 2 A8 )
例 6 : 配列全体の書き込み
DIMENSION V(5)WRITE( 3, '(5F4.1)') V
例 7 : 変数群出力を指定したWRITE
CHARACTER SAMPLE*16LOGICAL NEW*4REAL DELTA*4NAMELIST /G/ SAMPLE, NEW, DELTA...WRITE( 1, G )またはWRITE( UNIT=1, NML=G )またはWRITE( 1, NML=G )
|
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |
ホーム | 目次 | 前ページへ | 次ページへ | 索引 |