FORTRAN 77 言語リファレンス ホーム目次前ページへ次ページへ索引


第 4 章

この章では Sun WorkShop FORTRAN 77 コンパイラ f77 の文について説明しています。規格外の文はシンボル記号 (©) で示しています。(規格準拠の詳細については、第 1 章を参照してください。) 文の例は、付録 B「文の例」を参照してください。

ACCEPT

ACCEPT © 文は標準入力から読み取り、以下の構文を使用します。

構文

ACCEPT f [, iolist ]

ACCEPT grname

パラメータ 説明
f 書式識別子
iolist 変数、部分列、配列、および記録の並び
grname 変数群の名前


説明

ACCEPT f [,iolist] 文は READ f [,iolist] に相当し、Fortran 77 の旧バージョンとの互換用に提供されています。

例 : 並び入力

	REAL VECTOR(10) 
	ACCEPT *, NODE, VECTOR 

ASSIGN

ASSIGN 文は文番号を変数に代入します。

ASSIGN s TO i

パラメータ 説明
s 文番号
i 整変数


説明

文番号 s は実行文または FORMAT 文の文番号です。

文番号は、 ASSIGN 文と同じプログラム単位内に定義されている文の文番号でなければなりません。

整数の変数 i には、一度文番号を代入した後、同じ文の番号、異なる文の番号、整数のいずれかを再代入することができます。ただし、INTEGER*2 で宣言することはできません。

文番号を変数に代入すると、以下で引用することができます。

制限事項

変数を割り当て型 GO TO 文の文番号、または書式識別子として引用するには、その前に変数に文番号を代入しなければなりません。

i に文番号値を代入しているときは、i で演算を行ってはいけません。

64 ビット プラットフォームでは、ASSIGN 文によって変数 i に格納された実数値はプログラムで使用できません。ただし、割り当て型 GO TO 文中で使用する場合、または入出力文中で書式識別子として使用する場合は除きます。さらに、割り当て型
GO TO 文の中、または書式識別子として使用できる変数は、ASSIGN 文によって指定された変数に限ります。


例 1 : 実行文の文番号を代入

	IF(LB.EQ.0) ASSIGN 9 TO K 
	... 
	GO TO K 
	... 
9	AKX = 0.0


例 2 : FORMAT 文の文番号を代入

	INTEGER PHORMAT 
2	FORMAT ( A80 ) 
	ASSIGN 2 TO PHORMAT 
	... 
	WRITE ( *, PHORMAT ) 'FORMAT 文の文番号が割り当てられました。' 


代入

代入文は値を変数、部分列、配列要素、記録、または記録欄に代入します。

v = e

パラメータ 説明
v 変数、部分列、配列要素、記録、または記録欄
e 代入値を与える式


説明

値は定数または式の結果です。代入文の種類には算術代入、論理代入、文字代入、および記録代入があります。

算術代入

v は数値型であり、変数、配列要素、または記録欄の名前です。

e は算術式、文字定数、または論理式です。論理値を数値として代入することは規格外のため移植できない場合があります。結果のデータ型は v のデータ型になります。©

算術代入文を実行すると、式 e が評価され、(型が異なる場合) v の型へ変換され、v に代入されます。結果の値の型は下表に従って決まります。

v の型 e の型
INTEGER*2、INTEGER*4 または INTEGER*8 INT(e)
REAL REAL(e)
REAL*8 REAL*8
REAL*16 (SPARC のみ) QREAL(e) (SPARC のみ)
DOUBLE PRECISION DBLE(e)
COMPLEX*8 CMPLX(e)
COMPLEX*16 DCMPLX(e)
COMPLEX*32 (SPARC のみ) QCMPLX(e) (SPARC のみ)



注 - オプション -i2-dbl-r8、または -xtypemap のいずれかを指定してコンパイルした場合、変数と式のデフォルトのデータサイズが変更されることがあります。これについては第 2 章「データ型とデータ項目」を参照してください。これらのオプションについては、『Fortran ユーザーズガイド』も参照してください。

例 : 代入文

	REAL A, B 
	DOUBLE PRECISION V 
	V = A * B 

上記の例は、次の例とまったく同じようにコンパイルされます。

	REAL A, B 
	DOUBLE PRECISION V 
	V = DBLE( A * B )

論理代入

v は論理型の変数、配列要素、または記録欄の名前です。

e は論理式、-128 と 127 の間の整数、または単一の文字定数です。

論理代入文を実行すると、論理式 e が評価され、結果の値が v に代入されます。e
(-128 と 127 の間の整数または単一の文字定数ではなく) 論理式の場合、e は真か偽のどちらかの値を持ちます。

任意のサイズの論理式を任意のサイズの論理変数に代入できます。LOGICAL 文に関する節で、論理変数のサイズについてさらに詳しく述べます。

文字代入

この定数はホレリス定数またはアポストロフィ (') か引用符 (") で区切られた文字列です。文字列には制御文字の Control-A、Control-B、Control-C を含むことはできません。すなわち、Control キーを押しながら、A、B、C のキーを押すことはできません。これらの制御文字を必要とする場合は、関数 CHAR() を使用してください。

引用符を使用して文字定数を区切ると、-xl オプションを指定してコンパイルすることができません。この場合の引用符は 8 進定数を意味するからです。文字は変換されずに変数に移されます。これは移植できない場合があります。

演算子 // を含む文字式は CHARACTER 型の項目にだけ代入できます。ここで vCHARACTER 型で、変数、部分列、配列要素、または記録欄の名前です。e は文字式です。

文字代入文を実行すると、文字式が評価され、結果の値が v に代入されます。e の長さが v の長さより長い場合、右側の文字が切り捨てられます。e の長さが v の長さより短かければ、空白文字が右側に詰められます。

記録代入

ve は各々が記録または記録欄です。©

ev は同じ構造体である必要があります。以下の場合は同じ構造体です。

RECORD 文と STRUCTURE 文に関する節で、記録の構造についてさらに詳しく述べます。

例 1 : 算術代入

	INTEGER I2*2, J2*2, I4*4 
	REAL R1, QP*16  ! (REAL*16 は SPARC のみ)
	DOUBLE PRECISION DP 
	COMPLEX C8, C16*16, QC*32  ! (COMPLEX*32 は SPARC のみ)
	J2 = 29002 
	I2 = J2 
	I4 = (I2 * 2) + 1 
	DP = 6.4D9 
	QP = 6.4Q9 
	R1 = DP 
	C8 = R1 
	C8 = ( 3.0, 5.0 ) 
	I2 = C8 
	C16 = C8 
	C32 = C8 


例 2 : 論理代入

	LOGICAL B1*1, B2*1 
	LOGICAL L3, L4 
	L4 = .TRUE. 
	B1 = L4 
	B2 = B1 


例 3 : ホレリス代入

	CHARACTER S*4 
	INTEGER I2*2, I4*4 
	REAL R 
	S = 4Hwxyz 
	I2 = 2Hyz 
	I4 = 4Hwxyz 
	R = 4Hwxyz


例 4 : 文字代入

	CHARACTER BELL*1, C2*2, C3*3, C5*5, C6*6 
	REAL Z
	C2 = 'z' 
	C3 = 'uvwxyz' 
	C5 = 'vwxyz' 
	C5(1:2) = 'AB' 
	C6 = C5 // C2 
	BELL = CHAR(7)    制御文字 (^G)


上記の結果は次のとおりです。

C2   は、'zD'        後続に空白があります
C3   は、'uvw'
C5   は、'ABxyz'
C6   は、'ABxyzz'     C5 の左側に余分の z があります
BELL 16 進の 07  Control-Gベルです

例 5 : 記録代入と記録欄代入

	STRUCTURE /PRODUCT/ 
	INTEGER*4 ID 
	CHARACTER*16 NAME 
	CHARACTER*8 MODEL 
	REAL*4 COST 
	REAL*4 PRICE 
	END STRUCTURE 
	RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10) 
	... 
	CURRENT = NEXT       記録から記録へ
	LINE(1) = CURRENT    記録から配列要素へ
	WRITE ( 9 ) CURRENT  記録全体を書き込む
	NEXT.ID = 82         値を欄に割り当てる


AUTOMATIC

AUTOMATIC © 文を使用すると、副プログラムが再帰的に呼び出されるごとに各指定項目のコピーが確実に行われます。

また、この文を使用すると、副プログラムが RETURN 文で終了する場合に、副プログラムの外で指定項目が確実に未定義になります。

AUTOMATIC vlist

パラメータ 説明
vlist 変数および配列の並び


説明

自動変数を使用すると、手続きの呼び出しごとに 1 つコピーが行われます。呼び出したときに局所変数が未定義になるのを避けるために、f77 はすべての局所変数をデフォルトで静的に定義すると共に、あらゆる変数を静的か自動のどちらかに分類します。STATIC © 文、AUTOMATIC © 文、または IMPLICIT 文で明示的に変数を静的または自動に定義することもできます。『Fortran ユーザーズガイド』の第 3 章「式」にある -stackvar オプションも参照してください。

AUTOMATIC の使用法として、関数のスタート時にすべての自動変数を宣言することができます。

例:暗黙の自動変数を持つ再帰関数

	INTEGER FUNCTION NFCTRL( I )
	IMPLICIT AUTOMATIC (A-Z)
	...
	RETURN
	END

局所変数および局所配列はデフォルトでは静的になるため、一般に SAVE を使用する必要はありませんが、SAVE を使用することにより移植性を確実にすることができます。また、RETURN 以外の方法により副プログラムを終了する場合にも SAVE を使用すると安全です。

制限事項

自動変数と自動配列は、DATA または SAVE 文では使用できません。

また、引数と関数値は f77 によって常に自動にされるため、 DATARECORDSTATICSAVE 文では使用できません。


: AUTOMATIC のその他の使用例を示します。

	AUTOMATIC A, B, C 
	REAL P, D, Q 
	AUTOMATIC P, D, Q 
	IMPLICIT AUTOMATIC (X-Z) 

例 : AUTOMATIC の場合、構造体の動作は予測できません。

demo% cat autostru.f
	AUTOMATIC X
	STRUCTURE /ABC/
	  INTEGER I
	END STRUCTURE
	RECORD /ABC/ X			 X は自動だが、構造体にすることはできない。
	X.I = 1
	PRINT '(I2)', X.I
	END
demo% f77 -silent autostru.f
demo% a.out
*** TERMINATING a.out 	              	(:停止  a.out)
*** Received signal 10 (SIGBUS)    	(: シグナル 10 SIGBUS を受け取りました)
Bus Error (core dumped)                 (訳:  バスエラー)
demo%

制限事項

AUTOMATIC 文と型宣言文を結合して AUTOMATIC 型宣言文を作ることはできません。

たとえば、AUTOMATIC REAL X では、変数 XAUTOMATICREAL であると宣言しているのではなく、変数 REALXAUTOMATIC であると宣言しています。

BACKSPACE

BACKSPACE 文は先行する記録の直前に指定ファイルを位置付けます。

BACKSPACE u

BACKSPACE( [UNIT= ] u [, IOSTAT=ios ] [, ERR=s ] )

パラメータ 説明
u ファイルに結合された外部装置の装置識別子
ios 入出力状態指定子、整変数、または整数の配列要素
s 誤り指定子:s は、BACKSPACE 文が使用されているプログラム単位内にある実行文の文番号であること。BACKSPACE 文の実行中にエラーが生じるとプログラムの制御はこの文番号に移される。


説明

端末ファイルにおける BACKSPACE は無効です。

u は順番探査に結合する必要があります。直接探査ファイルにおける BACKSPACE 文の実行は FORTRAN 77 規格では定義されておらず、どのようになるか保証できません。直接探査ファイル、または追加探査ファイルにおいて BACKSPACE 文を使用することは好ましくありません。FORM='BINARY' として開いたファイルに対しては BACKSPACE は指定できず、実行時にエラーとなります。

BACKSPACE 文を実行すると、ファイル位置が次のように変更されます。

実行前 実行後
ファイルの始め
そのまま
ファイル終了記録の後
ファイル終了記録の前
直前の記録の始め
同じ記録の開始位置



例 1 : 簡単なバックスペース

	BACKSPACE 2 
	LUNIT = 2 
	BACKSPACE LUNIT 


例 2 : エラートラップを伴うバックスペース

	INTEGER  CODE
	BACKSPACE ( 2, IOSTAT=CODE, ERR=9 ) 
	... 
9	WRITE (*,*) 'BACKSPACE 中にエラー' 
	STOP 


BLOCK DATA

BLOCK DATA 文は、名前付き共通ブロック内の変数と配列を初期化する副プログラムを識別します。

パラメータ 説明
name BLOCK DATA 文が使用される初期値設定副プログラムの英字名。
このパラメータは省略可能。これは大域名。


BLOCK DATA [ name ]

説明

初期値設定副プログラムには、複数の名前付き共通ブロックの複数のデータの初期値を含むことができます。

BLOCK DATA 文は初期値設定副プログラムの最初の文でなければなりません。

初期値設定副プログラムで使用できるのは以下の文です。

名前付き共通ブロックに定義された項目だけが初期値設定副プログラムで初期設定できます。

名前付き共通ブロックの 1 つの項目を初期設定すると、その共通ブロック内に記憶単位を持つすべての項目は、初期設定していなくても COMMON 文で宣言する必要があります。

制限事項

実行可能プログラムでは、名前なし初期値設定副プログラムを 1 つしか使用できません。

同じ名前付き共通ブロックは、同じ実行可能プログラムの 2 つ以上の初期値設定副プログラムに指定することはできません。

省略可能なパラメータの名前は同じ実行可能プログラムの外部手続き、主プログラム、共通ブロック、または他の初期値設定副プログラムの名前と同じであってはなりません。名前は副プログラムの局所名と同じであってはなりません。

	BLOCK DATA INIT 
	COMMON /RANGE/ X0, X1 
	DATA X0, X1 / 2.0, 6.0 / 
	END 


BYTE

BYTE © 文は型が 1 バイトの整数であることを指定します。配列次元を指定したり、初期値を与えたりすることもできます。

BYTE v [/c/] ...

パラメータ 説明
v 定数名、変数、配列、配列宣言子、関数、または仮関数のどれかの名前
c 直前の名前に対する定数の並び


説明

これは LOGICAL*1 と同義です。BYTE 型の項目は論理値の .TRUE.、.FALSE.、1 つの 8 ビットデータ項目、または -128 と 127 の間の整数を持つことができます。

	BYTE BIT3 /8/, C1/'W'/, M/127/, SWITCH/.FALSE./


CALL

CALL 文は指定サブルーチンに分岐し、そのサブルーチンを実行し、終了した後、呼び出し元のプログラムへ戻ります。

CALL sub [ ( [ ar [, ar ] ... ] ) ]

パラメータ 説明
sub 呼び出されるサブルーチンの名前
ar サブルーチンに引き渡す実引数


説明

引数はコンマで区切られます。

FORTRAN 77 規格では CALL 文における実引数の順序、数値、型が、引用されるサブルーチンの対応する仮引数と一致することを必要とします。-XlistE オプションを設定した場合のみ、コンパイラはこれをチェックします。

再帰は許可されます。副プログラムがそれ自体を直接呼び出すか、またはこのサブルーチンを続いて呼び出す別の副プログラムを呼び出すことにより、間接的に呼び出すことができます。このような再帰は規格外です。©

実引数 ar は次のいずれかでなければなりません。

最も基本的な式、および最も多く使用される式には次のようなものがあります。

サブルーチンに引数がない場合、そのサブルーチンを引用する CALL 文に実引数があってはなりません。空の引数をサブルーチン名の後に続けることができます。

CALL 文の実行は次のように進みます。

1. すべての式 (引数) が評価されます。

2. すべての実引数が対応する仮引数に関連付けられ、サブルーチンの本体が実行されます。

3. 通常、RETURN または END 文をサブルーチンで実行するとき、制御は CALL 文の後の文に移されます。RETURN n という形式による選択戻りが実行されると、制御は CALL 文の n という選択戻り指定子により指定された文へ移されます。


注 - SUBROUTINE としてでなく FUNCTION として定義された副プログラムに対して CALL 文を使用すると、予測できない結果になる可能性があるので、使用しないでください。このように不適切な CALL 文があっても、警告メッセージは表示されません。


例 1 : 文字列

	CHARACTER *25 TEXT 
	TEXT = 'Some kind of text string' 
	CALL OOPS ( TEXT ) 
	SUBROUTINE OOPS ( S ) 
	CHARACTER S*(*) 
	WRITE (*,*) S 
	END


例 2 : 選択戻り

	CALL RANK ( N, *8, *9 ) 
	WRITE (*,*) 'OK - 正常戻り' 
	STOP 
8	WRITE (*,*) '重要でない - 最初の代替戻り' 
	STOP 
9	WRITE (*,*) '重要 - 2 番目の代替戻り' 
	STOP 
	END 

 
	SUBROUTINE RANK ( N, *, * ) 
	IF ( N .EQ. 0 ) RETURN 
	IF ( N .EQ. 1 ) RETURN 1 
	RETURN 2 
	END 


例 3 : 選択戻りの別の形式。& は規格外。©

	CALL RANK ( N, &8, &9 )


例 4 : 配列、配列要素、および変数。

	REAL M(100,100), Q(2,2), Y 
	CALL SBRX ( M, Q(1,2), Y ) 
	... 
	END 
	SUBROUTINE SBRX ( A, D, E ) 
	REAL A(100,100), D, E 
	... 
	RETURN 
	END 


この例では、実数配列 M は実数配列 A に対応し、実数配列要素 Q(1,2) は実数変数 D に対応します。

例 5 : 構造体の記録と欄。記録は規格外。©

	STRUCTURE /PRODUCT/ 
	INTEGER*4 ID 
	CHARACTER*16 NAME 
	CHARACTER*8 MODEL 
	REAL*4 COST 
	REAL*4 PRICE 
	END STRUCTURE 
	RECORD /PRODUCT/ CURRENT, PRIOR 
	CALL SBRX ( CURRENT, PRIOR.ID ) 
	... 
	END 
	SUBROUTINE SBRX ( NEW, K ) 
	STRUCTURE /PRODUCT/ 
	INTEGER*4 ID 
	CHARACTER*16 NAME 
	CHARACTER*8 MODEL 
	REAL*4 COST 
	REAL*4 PRICE 
	END STRUCTURE 
	RECORD /PRODUCT/ NEW 
	... 
	RETURN 
	END 


上記の例では、記録 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)*17 
	CHARACTER C*(6+3) 

上記の 2 つの例はどちらも規格外です。©

	CHARACTER A*17, B*17(3,4), V*17(9) 非標準

空文字列 (長さがゼロ) の変数は存在しません。空文字を代入された 1 バイトの文字列の長さは 1 です。

例 2 : 空文字列の変数は存在しません。

	CHARACTER S*1
	S = ''


代入文の実行中、変数 S はあらかじめ消去されて空白になり、0 個の文字が S に移されるので、S は空白を 1 つ含みます。宣言により、LEN(S)1 という長さを戻します。1 より小さいサイズを宣言することはできないので、これは最も短い文字列変数になります。

例 3 : 固定長の仮引数文字列

	SUBROUTINE SWAN ( A ) 
	CHARACTER A*32 


例 4 : 対応する実引数と同じ長さを持つ仮引数文字列

	SUBROUTINE SWAN ( A ) 
	CHARACTER A*(*) 
	... 


例 5 : 括弧に囲まれたアスタリスクを持つ定数名

	CHARACTER *(*) INODE 
	PARAMETER ( INODE = '警告: INODE が破壊されています !' ) 
	... 


組み込み関数 LEN (INODE) は、文字列の実際に宣言された長さを返します。この関数は主に仮引数 CHAR*(*) と一緒に使用されます。

例 6 : 組み込み関数 LEN

	CHARACTER A*17 
	A = "xyz" 
	PRINT *, LEN( A ) 
	END


上記のプログラムは 3 ではなく、17 を表示します。

CLOSE

CLOSE 文は装置からファイルを切り離します。

CLOSE( [UNIT=] u [, STATUS=sta] [, IOSTAT=ios]

[, ERR=s] )

パラメータ 説明
u 外部装置のための装置識別子。UNIT= を使用しない場合、u を最初に指定すること。
sta ファイルの処置を決める。sta は文字式で、後続の空白が取り除かれると値は KEEP または DELETE になる。状態指定子のデフォルト値は KEEP。一時 (スクラッチ) ファイルの場合、sta は常に DELETE になる。一時ファイル以外の他のファイルの場合、デフォルトの staKEEP
ios 入出力状態指定子 ios は整変数または整数の配列要素であること。
s 誤り指定子 sCLOSE 文を含むプログラムの中の実行文の文番号であること。CLOSE 文の実行時にエラーが生じると、プログラムの制御はこの文に移される。


説明

磁気テープを使用する場合は、TOPEN() ルーチンを使用する方が確実です。

オプションの指定はどのような順序でもかまいません。

DISP=DISPOSE= オプションは STATUS= に対する代替として許可されていますが、
-ansi フラグが設定されていると警告が出されます。

CLOSE 文の実行は次のように進みます。

1. 指定された装置が切り離されます。

2. staDELETE であれば、指定された装置に結合されたファイルが削除されます。

3. 引数 IOSTAT を指定すると、エラーが発生しなければ、ios はゼロに、そうでない場合は正の値に設定されます。

注釈

開いているすべてのファイルは、通常のプログラム終了時にデフォルトの sta で閉じられます。指定された sta に関係なく、一時ファイルは閉じられると常に削除されます。

存在しない装置、またはファイルが結合されていない装置を指定する CLOSE 文を実行しても無効です。

装置にゼロを指定した CLOSE 文 (規格ではエラーになる) の実行は許可されませんが、装置を他のファイルとして再び開くことができます。

CLOSE 文の実行により切り離された装置/ファイルは、同じファイル/装置または異なるファイル/装置に再度結合できます。


注 - テープ入出力の場合、TOPEN()ルーチンを使用します。


例 1 : 閉じて保持する

	CLOSE ( 2, STATUS='KEEP') 


例 2 : 閉じて削除する

	CLOSE ( 2, STATUS='DELETE', IOSTAT=I ) 


例 3 : STATUSSCRATCH であっても、一時ファイルを閉じ残す

	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, M 
	COMMON / LIMITS / I, J 
	... 


上記において VM は無名共通ブロックにあります。一方、IJ は名前付き共通ブロック LIMITS 内で定義されています。

例 2 : 同一プログラム単位内の 2 つの異なる共通ブロックの要素を関連付けることはできません。

	COMMON /X/ A 
	COMMON /Y/ B 
	EQUIVALENCE ( A, B)			  できない


例 3 : EQUIVALENCE 文は共通ブロックを右側に拡張することができます。

	DIMENSION A(5) 
	COMMON /X/ B 
	EQUIVALENCE ( B, A) 


例 4 : EQUIVALENCE 文は共通ブロックを左側に拡張しないでください。

	COMMON /X/ A 
	REAL 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 つの関数 DIMAGDREAL は例外で、実数値を返します。

4 倍精度用の特定の複素関数があります (SPARC のみ)。一般に、特定の REAL と、これに対応する C 接頭辞の付いた COMPLEX、CD 接頭辞の付いた COMPLEX DOUBLE があります。さらに CQ 接頭辞の付いた 4 倍精度 COMPLEX 関数もあります。たとえば、SIN()CSIN()CDSIN()CQSIN() など


例 1 : 複素変数。以下の文は等価です。

	COMPLEX 	U, V	
	COMPLEX*8 	U, V	
	COMPLEX 	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)*16
	COMPLEX U*32(5), V(5)*32
	COMPLEX X*8(5), Y(5)*8


CONTINUE

CONTINUE 文は何も行わない文です。(SPARC のみ)

[ label ] CONTINUE

パラメータ 説明
label 文番号


説明

CONTINUE 文は文番号を付ける場所として使用されることが多く、通常 DO ループの終わりにあります。

CONTINUE 文は文番号を付けるのに便利なので、特に DO ループの終了文として使用されます。CONTINUE 文は、何も実行しません。

CONTINUE 文が DO ループの終了文として使用される場合、実行される次の文は DO ループの出口の条件によって決まります。

	DIMENSION U(100) 
	S = 0.0 
	DO 1 J = 1, 100 
	S = S + U(J) 
	IF ( S .GE. 1000000 ) GO TO 2 
1	CONTINUE 
	STOP 
2	CONTINUE 
	. . .


DATA

DATA 文は、変数、部分列、配列、配列要素を初期化します。

DATA nlist / clist / [[,] nlist / clist /] ...

パラメータ 説明
nlist コンマで区切った変数、配列、配列要素、部分列、および DO 型並び
clist 形式 c [, c]... をもつ並び
c 形式 c または r*c の 1 つ。c は定数または定数の定数名
r ゼロでない符号なし整定数、またはこのような定数の定数名


説明

実行可能プログラムの実行開始時に初期値を定義されていた項目は、すべて指定された値で定義されます。

r*c は定数 c を r 個連続させたものと同等です。

DATA 文は非実行文であり、すべての宣言文の後に現れなければなりませんが、文関数と実行文を混在させることができます (ただし、これは規格外となります)。©


注 - コンパイルに -stackvar オプションを使用した場合、実行文から局所変数が参照された後、DATA 文でその局所変数を初期化するとエラーとして扱われます。『Fortran ユーザーズガイド』を参照してください。

clist の (反復因子を考慮に入れた) 定数の数は nlist の項目数と同じでなければなりません。nlist における配列の出現はその配列のすべての要素の並びを指定するのと同等です。配列要素は定数の添字によってだけ索引できます。

DATA 文には自動変数や自動配列を記述できません。

通常の型変換が clist の文字型でない各メンバーに対して起こります。

DATA 文の文字定数

nlist の文字項目の長さが対応する clist の定数より長い場合、右側に空白文字が詰められます。

nlist の文字項目の長さが対応する clist の定数より短い場合、余分な右側の文字が無視されます。

clist の定数が整数型で nlist の項目が文字型である場合、下記の規則に従ってください。

clist の定数が文字定数またはホレリス定数で、nlist の項目が INTEGER 型である場合、割り当てられる文字の数は INTEGER*2INTEGER*4 に対しそれぞれ 2 と 4 です。文字定数またはホレリス定数が項目の容量より少ない文字数を持つ場合、定数は右側にスペースで拡張されます。文字またはホレリス定数が格納できるより多くの文字を持つ場合、定数の右側が切り捨てられます。

DO 型並び

nlist は配列要素を初期化するために DO 型並びを指定することができます。

DO 型並びの形式は下記のとおりです。

(dlist, iv = m1, m2 [,m3 ])

パラメータ
説明
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*16 
	REAL 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*1 
	INTEGER I*2, N*4 
	DATA 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 ]

パラメータ 説明
size 変換される文字数、整数式
f 書式識別子で、FORMAT 文の文番号。書式列を指定する文字式またはアスタリスクのどれか。
buf 変数、配列、または配列要素
ios 入出力状態指定子 ios は整変数または整数配列要素であること。
s 誤り指定子 (文番号) sENCODEDECODE 文が出現するプログラム単位の中の実行文の文番号であること。
iolist 入出力項目の並び


説明

入出力並びの構成要素としては、変数、部分列、配列、配列要素、記録欄が可能です。単純な添字なし配列名は、配列のすべての要素を記憶領域順で指定します。左端の添字が最も速く増加します。

実行順序は以下のとおりです。

  1. ENCODE 文は書式識別子に従って並びの項目を文字形式に変換し、文字を buf に格納します。内部ファイルの WRITE 文も同じ操作を行います。

  2. DECODE 文は書式識別子に従って buf の文字データを内部 (2 進) 形式に変換し、並びの項目に格納します。READ 文も同じ操作を行います。

  3. buf が配列の場合、その要素は左端の添字が最も速く増加する順序で処理されます。

  4. ENCODE または DECODE 文が処理することのできる文字数は buf のデータ型によります。たとえば、INTEGER*2 配列は 1 要素当たり 2 文字を持つことができるので、文字の最大数は配列の要素数の 2 倍になります。文字変数または文字配列要素はその長さに等しい数の文字を持つことができます。文字配列は各要素の長さと要素数の積に等しい数の文字を持つことができます。

  5. 書式識別子と入出力並びの間の関係は書式付き入出力文と同様です。


DECODE/ENCODE プログラム

	CHARACTER S*6 / '987654' /, T*6 
	INTEGER V(3)*4 
	DECODE( 6, '(3I2)', S ) V 
	WRITE( *, '(3I3)') V 
	ENCODE( 6, '(3I2)', T ) V(3), V(2), V(1) 
	PRINT *, T 
	END

上記のプログラムは下記を出力します。

    98 76 54 
   547698

DECODE は文字 S を 3 つの整数として読み取り、それらを V(1)、V(2)、および V(3) に格納します。

ENCODE 文は値 V(1)、V(2)、および V(3) を文字として T に書き込みます。
T'547698' になります。

DIMENSION

DIMENSION 文は配列の次元数とそれぞれの次元の要素数を指定します。

DIMENSION 文で任意に各項目の初期値を与えることができます。

DIMENSION a ( d ) [,a ( d )] ...

パラメータ 説明
a 配列名
d 配列の形状を指定します。コンマにより区切られた 1 個から 7 個までの
宣言子の並び。


説明

ここでは、寸法宣言子と配列について説明します。

寸法宣言子

それぞれの寸法の上下限は寸法宣言子により決められます。寸法宣言子の形式は次のとおりです。

[ dd1 :] dd2 

dd1dd2 は上下限値を指定する寸法上下限式です。これらには整数型または実数型の算術式が使用できます。これらは定数、定数名、仮引数、または COMMON 文で定義された変数を使用して作成することができます。配列引用およびユーザー定義関数の引用は次元上下限式では使用できません。dd2 はアスタリスクも可能です。dd1 が指定されないと値 1 がとられます。dd1 の値は dd2 以下でなければなりません。

非定数の寸法上下限式は、整合配列を定義するために副プログラムで使用できます。しかし主プログラムでは使用できません。

非整数の上下限式は使用する前に整数に変換されます。小数部は切り捨てられます。

整合配列

寸法宣言子が仮引数または COMMON 文で定義された変数を含む算術式である場合、この配列は整合配列と呼ばれます。この場合、寸法は副プログラムへの入口の引数の初期値に等しくなります。

大きさ引き継ぎ配列

配列は、寸法宣言子にアスタリスクがある場合、大きさ引き継ぎ配列と呼ばれます。この場合、寸法の上限は規定されません。アスタリスクは仮配列にだけ使用可能で、配列宣言子の最後の寸法の上限として現れます。


例 1 : 主プログラムの配列

	DIMENSION M(4,4), V(1000) 
	... 
	END 


上記の例では、M は形状 4 × 4 の配列として指定され、V は形状 1000 の配列として指定されます。

例 2 : サブルーチンの整合配列

	SUBROUTINE INV( M, N ) 
	DIMENSION M( N, N ) 
	... 
	END 


上記の例では仮引数は配列 M と変数 N です。M は形状 N × N の平方配列用として指定されます。

例 3 : 上下限

	DIMENSION HELIO (-3:3, 4, 3:9) 
	... 
	END 


上記では HELIO は三次元配列です。最初の要素は HELIO(-3,1,3) で、最後の要素は HELIO(3,4,9) です。

例 4 : 上下限付き仮配列

	SUBROUTINE ENHANCE( A, NLO, NHI ) 
	DIMENSION A(NLO : NHI) 
	... 
	END 


例 5 : 非整数の上下限

	PARAMETER ( LO = 1, HI = 9.3 ) 
	DIMENSION A(HI, HI*3 + LO ) 
	... 
	END 


上記の例では A は形状 9 × 28 の配列です。

例 6 : 非整数の上下限付き整合配列

	SUBROUTINE ENHANCE( A, X, Y ) 
	DIMENSION A(X : Y) 
	... 
	END


例 7 : 大きさ引き継ぎ配列

	SUBROUTINE RUN(A,B,N)
	DIMENSION A(*), B(N,*)
	...


DO

DO 文は 1 組の文を繰り返し実行します。

DO s [,] loop-control

または

DO loop-control ©

s 実行文の文番号

loop-control の形式は以下のとおりです。

variable = e1, e2 [, e3 ]

パラメータ 説明
variable 整数型、実数型、倍精度型、またはバイト型の変数
e1, e2, e3 整数型、実数型、または倍精度型の式で、それぞれ初期値、限界値、および増分値を指定する。


説明

DO 文は、以下の構文を含みます。

文番号付き DO ループ

文番号付き 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 ループ ©

ブロック 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 ループ

	N = 0 
	DO 210 I = 1, 10 
	J = I 
	DO 200 K = 5, 1 
		L = K
		N = N + 1 
200 	CONTINUE 
210	CONTINUE 
	WRITE(*,*)'I =',I, ', J =',J, ', K =',K, 
&												', N =',N, ', L =',L
	END
demo % f77 -silent DoNest1.f
"DoNest1.f", line 4: 警告: DO の範囲が実行されていません。
demo % a.out
I =  11, J =  10, K =  5, N =  0, L =  0
demo % 


内部ループは実行されず、WRITE のときは L が未定義です。ここで L は 0 として示されていますが、これは処理系によって異なります。この例とは同じではない場合があります。

例 2 : プログラム DoNest2.f (常に定義されている DO 変数)

	INTEGER COUNT, OUTER 
	COUNT = 0 
	DO OUTER = 1, 5 
				NOUT = OUTER 
			DO INNER = 1, 3 
				NIN = INNER 
				COUNT = COUNT+1 
			END DO 
	END DO 
	WRITE(*,*) OUTER, NOUT, INNER, NIN, COUNT 
	END 


上記のプログラムは下記を出力します。

	6 5 4 3 15

DO WHILE

DO WHILE © 文は、指定された条件が真である限り、1 組の文を繰り返し実行します。

DO [ s [,]] WHILE (e)

パラメータ 説明
s 実行文の文番号
e 論理式


説明

実行手順は以下のとおりです。

1. 指定された式が評価されます。

2. 式の値が真の場合、DO WHILE ループの範囲内の文が実行されます。

3. 式の値が偽の場合、制御は DO WHILE ループに続く文に移ります。

端末文

s が指定されると、それにより識別される文は端末文と呼ばれ、DO WHILE 文の後に続かなければなりません。

端末文は以下の文であってはなりません。

端末文が論理 IF 文である場合、下記以外のすべての実行文を含むことができます。

s が指定されない場合、DO WHILE ループは END DO 文で終わらなければなりません。

DO WHILE ループの範囲

DO WHILE ループの範囲は、DO WHILE 文に続いて現れる端末文までの (端末文を含む) すべての実行文から構成されます。

DO WHILE 文が他の DO WHILE ループの範囲内に現れる場合、その範囲は外側の DO WHILE ループの範囲内に完全に含まれなければなりません。 2 つ以上の DO WHILE ループが同一の端末文を持つことができます。

DO WHILE 文が IF、ELSE IF、または ELSE ブロック内に現れる場合、関連する
DO WHILE ループの範囲は完全にそのブロック内になければなりません。

ブロック IF 文が DO WHILE ループの範囲内に現れる場合、対応する END IF 文もその DO WHILE ループの範囲内に現れなければなりません。

端末文処理

DO WHILE ループの端末文が実行された後、制御は対応する DO WHILE 文に返されます。

制限事項

DO WHILE ループの外側から DO WHILE ループの内側に飛び込むと、予測できない結果を生ずることがあります。

注釈

e で使用される変数は、DO WHILE ループの範囲内ではどのようにでも修飾することができます。


例 1 : 文番号のない DO WHILE

	INTEGER A(4,4), C, R 
	... 
	C = 4 
	R = 1 
	DO WHILE ( C .GT. R ) 
	A(C,R) = 1 
	C = C - 1 
	END DO 


例 2 : 文番号付き DO WHILE

	INTEGER A(4,4), C, R 
	... 
	DO 10 WHILE ( C .NE. R ) 
	A(C,R) = A(C,R) + 1 
	C = C+1 
10 	CONTINUE


DOUBLE COMPLEX

DOUBLE COMPLEX © 文は、倍精度複素数型を指定します。この文で配列次元と大きさを指定し、初期値を与えることもできます。

DOUBLE COMPLEX v [/c/] [, v [/c/] ...

パラメータ 説明
v 定数名、変数、配列、配列宣言子、関数、または仮関数の名前
c この前にくる名前についての定数の並び


説明

宣言は DOUBLE COMPLEX または COMPLEX*16 です。

DOUBLE COMPLEX ©

DOUBLE COMPLEX Z のように宣言すると、変数 Z はメモリー内で連続する 2 つの REAL*8 要素で、1 つの倍長の複素数と解釈されます。

サイズを指定しない場合、デフォルトサイズが使用されます。

DOUBLE COMPLEX Z などの宣言のデフォルトサイズを変更するには、オプション -dbl-r8、または -xtypemap のいずれかを指定してコンパイルします。詳細については、第 2 章「データ型とデータ項目」を参照してください。

COMPLEX*16 ©

COMPLEX*16 Z のような宣言では、変数 Z はメモリー内で連続する 2 つの REAL*8 要素で、1 つの倍長の複素数と解釈されます。

注釈

各複素数組み込み関数には倍精度複素数用のものがあります。一般に、その関数名は C の代わりに Z または CD で始まります。たとえば、SIN()、CSIN()、CDSIN() などです。2 つの関数 DIMAGDREAL は例外で、実数値を返します。

例 : 倍精度複素数スカラーと配列

	DOUBLE COMPLEX U, V 
	DOUBLE COMPLEX W(3,6) 
	COMPLEX*16 X, Y(5,5)
	COMPLEX  U*16(5), V(5)*16

DOUBLE PRECISION

DOUBLE PRECISION 文は、型を倍精度に指定し、配列形状を指定し、初期値を与えることもできます。

DOUBLE PRECISION v [/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*8 X のように宣言すると、変数 X は常にメモリー内の REAL*8 型の要素で、倍長の実数と解釈されます。

	DOUBLE PRECISION R, S(3,6) 
	REAL*8 T(-1:0,5) 

ELSE

ELSE 文は ELSE ブロックの始まりを示します。

IF ( e ) THEN
...
ELSE
...
END IF


eは論理式。

説明

ELSE 文の実行はプログラムに何の影響も与えません。

ELSE ブロックは、ELSE 文に続く、END IF 文までの (ただし、END IF 文は含まない) すべての実行文から構成されます。このときの END IF 文は ELSE 文と同じ IF の深さです。詳細については、「IF ブロック」を参照してください。

ELSE ブロックは空でも構いません。

制限事項

ELSE ブロックの外側から ELSE ブロックに移ることはできません。

ELSE 文の文番号はどの文からも参照できません。

ELSE と同じ IF の深さを有する END IF 文は、同じ IF の深さを有する ELSE IF、または ELSE 文の前に現れなければなりません。


例 1 : ELSE

	CHARACTER S 
	... 
	IF ( S .GE. '0' .AND. S .LE. '9' ) THEN 
	CALL PUSH 
	ELSE 
	CALL TOLOWER 
	END IF 
	... 


例 2 : END IF が期待されるところに無効の ELSE IF がある場合

	IF ( K .GT. 5 ) THEN 
	N = 1 
	ELSE 
	N = 0 
	ELSE IF ( K .EQ. 5 ) THEN 	 正しくない 
	... 


ELSE IF

ELSE IF は複数の条件決定構造を提供します。

ELSE IF (e2) THEN

IF (e1) THEN

END IF ...

e1 と e2 は論理式。

説明

一連の独立した検査を行うことが可能で、各検査は複数の文を指定できます。

ELSE IF ブロックは、ELSE IF 文に続く、ELSE IF 文と同じ IF の深さを有する次の ELSE IFELSE、または END IF 文までの (ただし、これらの文は含まない) すべての実行文から構成されます。

ELSE IF ブロックは空でも構いません。

ELSE IF (e)の実行手順は以下のとおりです。

1. e が評価されます。

2. e が真の場合、ELSE IF ブロックの最初の文から実行されます。e が真で ELSE IF ブロックが空の場合、その ELSE IF 文と同じ IF の深さを有する次の END IF 文に制御が移ります。

3. e が偽の場合、その ELSE IF 文と同じ IF の深さを有する次の ELSE IFELSE、または END IF 文に制御が移ります。

制限事項

ELSE IF ブロックの外側から ELSE IF ブロックに移ることはできません。

ELSE IF 文の文番号があったとしても、いかなる文もそれを引用することはできません。

ELSE IF と同じ IF の深さを有する END IF 文は、同じ IF の深さを有する ELSE IF または ELSE 文の前に現れなければなりません。


例 : ELSE IF

	READ (*,*) N 
	IF ( N .LT. 0 ) THEN 
	WRITE(*,*) 'N<0' 
	ELSE IF ( N .EQ. 0) THEN 
	WRITE(*,*) 'N=0' 
	ELSE 
	WRITE(*,*) '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*6 
	INTEGER V(3)*4 
	DATA S / '987654' / 
	DECODE( 6, 1, S ) V 
1	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 文はプログラムの実行を終了します。

関数またはサブルーチンでは END 文は RETURN と同じ効果を持ちます。©

FORTRAN 77 規格では END 文は継続行を持つことはできませんが、f77 ではこれを許可します。©

END IF 文のような他のいかなる文も、END 文とみなされるような開始行を持つことはできません。


例 : END

	PROGRAM MAIN 
	WRITE( *, * ) '極めて小さい' 
	END 

END DO

END DO © 文は DO ループを終了し、以下の構文を使用します。

END DO 

説明

END DO 文はブロック DO 文の区切り文です。文番号が DO 文で指定されない場合、対応する終了文は END DO 文でなければなりません。DO ループの範囲内からだけ END DO 文に分岐することができ、それにより DO ループを終了します。


例 1 : 文番号付き DO

	DO 10 N = 1, 100 
	... 
10	END DO 


例 2 : 文番号なし DO

	DO N = 1, 100 
	... 
	END DO 


END FILE

END FILE 文は、指定された装置に結合したファイルに、次の記録としてファイル終了記録を書き込みます。

END FILE u

END FILE ( [ UNIT= ] u [, IOSTAT=ios ] [, ERR=s ])

パラメータ
説明
u
ファイルと結合した外部装置の装置識別子。オプションは任意の順に指定できるが、UNIT= を省略する場合は u を最初にする。
ios
入出力状態指定子。整変数または整数の配列要素。
s
誤り指定s は、END FILE 文が現れたプログラム中の実行文の文番
号。END FILE 文の実行時にエラーが発生すると、プログラムの制御は
この文番号に渡される。


説明

磁気テープに、END FILE 文とその他の Fortran 77 規格入出力文を使用している場合は、代わりに信頼性の高い TOPEN() ルーチンを使用することをお勧めします。

2 個のファイル終了記録は、テープ終了マークを意味します。テープファイルに書き込む場合、END FILE は 2 個のファイル終了記録を書き込み、それから テープは 2 番目のファイル終了記録の前まで後退 (バックスペース) します。この場所でファイルを閉じると、ファイルの終了とテープの終了が表示されます。この場所から (次に現れる WRITE 文、または磁気テープを巻き戻さないで他のプログラムで使用することによって) 更に記録が書き込まれる場合、最初のテープマーク (ファイル終了記録) の次に別のデータファイルが続き、そして更に 2 個のテープマークが書き込まれます。

制限事項

u は順番探査ファイルに結合されます。直接探査ファイルでの END FILE 文の実行は FORTRAN 77 規格で定義されていないので、結果は予測できません。したがって直接探査ファイルに END FILE 文を使用しないでください。


例 1 : 定数

	END FILE 2 
	END FILE ( 2 ) 
	END FILE ( UNIT=2 ) 


例 2 : 変数

	LOGUNIT = 2 
	END FILE LOGUNIT 
	END FILE ( LOGUNIT ) 
	END FILE ( UNIT=LOGUNIT )


例 3 : エラートラップ

	NOUT = 2 
	END FILE ( UNIT=NOUT, IOSTAT=KODE, ERR=9) 
	... 
9	WRITE(*,*) 'END FILE でエラー。装置番号:', NOUT 
	STOP

END IF

END IF 文は、IF で始まるブロック IF の終わりを示し、以下の構文を使用します。

END IF 

説明

各ブロック IF 文に対応する END IF 文は同じプログラム単位内になければなりません。対応する END IF 文はブロック IF 文と同じ IF の深さにあります。


例 1 : IF/END IF

	IF ( N .GT. 0 )THEN 
	N = N+1 
	END IF 


例 2 : IF/ELSE/END IF 

	IF ( N .EQ. 0 ) THEN 
	N = N+1 
	ELSE 
	N = N-1 
	END IF 


END MAP

END MAP © 文は、MAP 宣言の終わりを示し、以下の構文を使用します。

END MAP 

説明

詳細については、「UNION と MAP」を参照してください。

制限事項 

MAP 文は UNION 文の中になければなりません。

	...
	MAP 
	CHARACTER *16 MAJOR 
	END MAP 
	...


END STRUCTURE

END STRUCTURE © 文は、構造体宣言の終わりを示し、以下の構文を使用します。

END STRUCTURE 

説明

詳細については、「STRUCTURE」を参照してください。

	STRUCTURE /PROD/ 
	INTEGER*4	ID 
	CHARACTER*16		NAME 
	CHARACTER*8		MODEL 
	REAL*4COST 
	REAL*4PRICE 
	END STRUCTURE 


END UNION

END UNION © 文は、共用体宣言の終わりを示し、以下の構文を使用します。

END UNION 

説明

詳細については、「UNION と MAP」を参照してください。

	UNION 
	MAP 
	CHARACTER*16 
	END MAP 
	MAP 
	INTEGER*2    CREDITS 
	CHARACTER *8 GRAD_DATE 
	END MAP 
	END UNION 


ENTRY

ENTRY 文は、副プログラム内の代替入口を定義します。

ENTRY en [ ( [ fa [, fa ] ... ] ) ]

パラメータ
説明
en
関数またはサブルーチン副プログラムの中の入口の英字名
fa
仮引数。仮引数は変数名、配列名、仮手続き名、または選択戻り文番号を指定するアスタリスク。


説明

入口名による引用手続き

サブルーチン副プログラム内で使用される入口名は、サブルーチンのように扱われ、CALL 文で引用できます。同様に、関数副プログラム内で使用される入口名は関数のように扱われ、関数として引用できます。

入口名を EXTERNAL 文の中で指定し、実引数として使用できます。仮引数としては使用できません。

入口副プログラム (サブルーチンまたは関数) の実行は、ENTRY 文の後の最初の実行文から始まります。

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, B 
	CHARACTER C*4 
	... 
	RETURN 

 
	ENTRY HLEP( A, B, C ) 
	... 
	RETURN 

 
	ENTRY MOOZ 
	... 
	RETURN 
	END 


上記の例では、サブルーチン FIN が 2 つの選択的入口を持ちます。入口 HLEP は引数の並びを持ち、入口 MOOZ は引数の並びを持ちません。

例 2 : 呼び出すルーチンの中で上記のサブルーチンと入口名を次のように呼び出します。

	INTEGER A, B 
	CHARACTER C*4 
	... 
	CALL FIN( A, B, C ) 
	... 
	CALL MOOZ 
	... 
	CALL HLEP( A, B, C ) 
	... 


上記のように CALL 文の順序は ENTRY 文の順序に合わせる必要はありません。

例 3 : 関数の複数の入口

	REAL FUNCTION F2 ( X ) 
	F2 = 2.0 * X 
	RETURN 

 
	ENTRY F3 ( X ) 
	F3 = 3.0 * X 
	RETURN 

 
	ENTRY FHALF ( X ) 
	FHALF = X / 2.0 
	RETURN 
	END 


EQUIVALENCE

EQUIVALENCE 文は、プログラム単位内の複数の変数、または配列が同じ記憶領域を共有することを宣言します。

EQUIVALENCE ( nlist ) [, ( nlist ) ] ...

パラメータ
説明
nlist
コンマで分離された変数名、配列要素名、配列名、および部分列名の並び


説明

EQUIVALENCE 文は、nlist の並びに現れる項目の記憶領域が同じ先頭アドレスを持つことを宣言します。

EQUIVALENCE 文は、nlist で指定されていない項目の関連付けを引き起こすことがあります。

配列名の指定は、配列の最初の要素を指定したのと同じ意味を持ちます。

EQUIVALENCE 文の中に配列要素名が現れる場合、添字の数は配列名の配列宣言子で指定される次元数より少ないか、または同じ数をとることができます。

制限事項

仮引数、および関数の名前は、nlist には指定できません。

配列要素の添字は、下限より大きくかつ上限より小さいか等しい整定数でなければなりません。

EQUIVALENCE 文は、自動変数を他の自動変数または記憶クラスと関連付けることができます。これらのクラスは、COMMONSTATICSAVEDATA 文、または仮関数であってはなりません。

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)*3 
	EQUIVALENCE (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 文は、外部手続きまたは外部仮手続きであることを宣言し、それらの英字名を実引数として使用することを可能にします。

EXTERNAL proc [, proc ] ...

パラメータ
説明
proc
外部手続き、外部仮手続き、または初期値設定副プログラムの名前


説明

外部手続きまたは外部仮手続きが実引数ならば、この実引数は同じプログラム単位の中の EXTERNAL 文内になければなりません。

組み込み関数名が EXTERNAL 文内に現れる場合、この組み込み関数名は外部サブルーチンまたは外部関数とみなされます。その名前の組み込み関数は、このプログラム単位内では使用できません。

制限事項

1 つのサブルーチン名または関数名は、プログラム単位内で EXTERNAL 文に 1 回だけ指定することができます。

文関数名は EXTERNAL 文内には表示できません。


例 1 : ユーザー作成の TAN の使用

	EXTERNAL TAN 
	T = TAN( 45.0 ) 
	... 
	END 
	FUNCTION TAN( X ) 
	... 
	RETURN 
	END 


例 2 : ユーザー定義関数名を引数として引き渡す

	REAL AREA, LOW, HIGH 
	EXTERNAL FCN 
	... 
	CALL RUNGE ( FCN, LOW, HIGH, AREA ) 
	... 
	END 

 
	FUNCTION FCN( X ) 
	... 
	RETURN 
	END 

 
	SUBROUTINE RUNGE ( F, X0, X1, A ) 
	... 
	RETURN 
	END


FORMAT

FORMAT 文は、入力または出力記録の配置を指定します。

label FORMAT ( f )

パラメータ
説明
label
文番号
f
書式仕様並び


f の中の項目形式:

[ r ] desc

r
反復因子 (オプション)
desc
編集記述子。ただし r が表示されている場合 desc は反復可能な編集記述子であること。


反復可能な編集記述子には、次のものがあります。

I
Iw
Iw.d
O
Ow
Ow.d
Z
Zw
Zw.d
F
Fw
Fw.d
A
Aw
L
Lw 
E
Ew
Ew.d
Ew.d.e
Ew.dEe
D
Dw
Dw.d
Dw.d.e
Dw.dEe
G 
Gw 
Gw.d
Gw.d.e
Gw.dEe


まとめ

反復不可能な編集記述子は以下のとおりです。

編集記述子の詳細は 「書式付き入出力」を参照してください。

説明

FORMAT 文には、記録の配置を作成または使用するための明示的な編集指示が含まれます。この編集指示は書式付き入出力文と ENCODE/DECODE 文で使用されます。

反復因子

r はゼロ以外の符号なし整定数でなければなりません。

反復可能な編集記述子

記述子 I、O、Z、F、E、D、G、L、および A は、編集方法を示し反復可能です。

we は、ゼロ以外の符号なし整定数です。

dm は、符号なし整定数です。

反復不可能な編集記述子

以下に反復不可能な記述子を示します。

(")、($)、(')、(/)、(:)、B、BN、BZ、H、P、R、Q、S、SU、SP、SS、T、TL、TR、X

これらの記述子は編集の方法を示し、反復不可能です。

項目分離文字

書式仕様並びの項目はコンマで分離されます。スラッシュまたはコロン編集記述子の前または後と、P 編集記述子とその直後の F、E、DG 編集記述子の間ではコンマは省略可能です。コンマがなくても意味が明白な所では省略できますが、上記の場合以外は規格外です。©

変数式 ©

一般に書式中の整定数は、山括弧で囲んだ任意の式に置換できます。

1    FORMAT(  ... < e > ... )

nH... 編集記述子の中の n は、変数式にはなりません。

制限事項

FORMAT 文の文番号は、GO TO 文、算術 IF 文、DO 文、選択戻り文の中では使用できません。

注意事項

明示的書式の場合、無効な書式文字列には、コンパイル時に警告とエラーメッセージ、またはそのどちらかが出されます。

変数書式の場合、無効な書式文字列には、実行時に警告とエラーメッセージ、またはそのどちらかが出されます。

<e> の変数書式の場合、無効な書式文字列には、コンパイル時または実行時に警告とエラーメッセージ、またはそのどちらかが出されます。

詳細については、「実行時書式」を参照してください。


例 1 : A、I、および F 書式

	READ( 2, 1 ) PART, ID, HEIGHT, WEIGHT 
1	FORMAT( A8, 2X, I4, F8.2, F8.2 ) 
	WRITE( 9, 2 ) PART, ID, HEIGHT, WEIGHT 
2	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 文で始まるプログラム単位は関数副プログラムとして識別されます。

[ 型 ] FUNCTION fun ( [ ar [, ar ] ... ] )

パラメータ 説明
BYTE ©
CHARACTER
CHARACTER*n (n は 1 以上であること)
CHARACTER*(*)
COMPLEX                                
COMPLEX*8 ©                    
COMPLEX*16 ©                
COMPLEX*32 © 
DOUBLE COMPLEX ©
DOUBLE PRECISION
INTEGER
INTEGER*2 ©
INTEGER*4 ©
INTEGER*8 ©
LOGICAL
LOGICAL*1 ©
LOGICAL*2 ©
LOGICAL*4 ©
LOGICAL*8 ©
REAL
REAL*4 ©
REAL*8 ©
REAL*16 ©
fun
fun関数に割り当てられた英字名
ar
fun仮引数名


(COMPLEX*32REAL*16 は、SPARC のみ使用できます)。

長さを指定するための代替構文を次に示します。©

[ 型 ] FUNCTION fun [*m]([ar[,ar] ...])

パラメータ
説明
m
データ型の長さを指定するゼロ以外の符号なし整定数
ar 仮引数名


説明

FUNCTION 文の型、値、仮引数について説明します。

関数の型

FUNCTION 文は、型、名前、および仮引数を含みます。

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' 
	RETURN 
	END 


上記の例で、BOOL は 5 文字長の CHARACTER 型の関数として定義されています。この関数は呼び出されると、変数 ARG の値に応じて文字列 TRUE または FALSE を返します。

例 2 : 実数関数

	FUNCTION SQR (A) 
	SQR = A*A 
	RETURN 
	END 


上記の例で、関数 SQR は (デフォルトで) REAL 型の関数として定義され、引き渡された数の 2 乗を返します。

例 3 : 関数のサイズ、 代替構文 ©

	INTEGER FUNCTION FCN*2 ( A, B, C ) 


上記の規格外形式は、次のように処理されます。

	INTEGER*2 FUNCTION FCN ( A, B, C ) 

GO TO (割り当て型)

割り当て型 GO TO 文は、変数に割り当てられた文番号値によって識別される文に分岐します。

GO TO i [[,]( s[, s]...)]

パラメータ
説明
i
整変数名
s
実行文の文番号


説明

実行は次のように進みます。

1. 割り当て型 GO TO 文の実行時、変数 i には、割り当て型 GO TO 文と同じプログラム単位内にある実行文の文番号値が割り当てられます。

2. 割り当て型 GO TO 文が実行されると、制御は i によって識別される文に移されます。

3. 文番号の並びが指定されている場合、i に割り当てられる文番号は並び内の文番号の
1 つでなければなりません。

制限事項

i は、GO TO 文と同じプログラム単位内にある ASSIGN 文によって割り当てられます。

i INTEGER*4 または INTEGER*8 でなければなりません。 INTEGER*2 であってはなりません。

sGO TO 文と同じプログラム単位内になければなりません。

GO TO 文の中に同じ文番号が 2 回以上現れてもかまいません。

分岐先の文は実行文でなければなりません。DATA、ENTRY、FORMATINCLUDE 文は指定できません。

DO、IF、ELSE IFELSE ブロックにブロックの外部から分岐することはできません。


例:割り当て型 GO TO

	ASSIGN 10 TO N 
	... 
	GO TO N ( 10, 20, 30, 40 ) 
	... 
10	CONTINUE 
	... 
40	STOP 

GO TO (計算型)

計算型 GO TO 文は、整数式または実数式の値に応じて並びから 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 文として実行されます。

制限事項

sGO TO 文と同じプログラム単位の中になければなりません。

GO TO 文の中に同じ文番号が 2 回以上現れてもかまいません。

分岐先の文は実行文でなければなりません。DATA、ENTRY、FORMATINCLUDE 文は指定できません。

DO、IF、ELSE IFELSE ブロックにブロック外部から分岐することはできません。


例 : 計算型 GO TO

	... 
	GO TO ( 10, 20, 30, 40 ), N 
	... 
10	CONTINUE 
	... 
20	CONTINUE 
	... 
40 	CONTINUE 

上記の例で

GO TO (単純)

単純 GO TO 文は、制御を指定された文に渡します。

GO TO s

パラメータ 説明
s 実行文の文番号


説明

GO TO 文の実行により、制御は s の文番号が付いた文に渡されます。

制限事項

sGO TO 文と同じプログラム単位内になければなりません。

分岐先の文は実行文でなければなりません。DATA、ENTRY、FORMATINCLUDE 文は指定できません。

DO、IF、ELSE IFELSE ブロックにブロックの外部から分岐することはできません。

	A = 100.0 
	B = 0.01 
	GO TO 90 
	... 
90	CONTINUE 


IF (算術)

算術 IF 文は、算術式の値に応じて 3 個の指定された文の 1 つへ分岐します。

パラメータ
説明
e
算術式 (整数、実数、倍精度、または 4 倍精度)
s1, s2, s3
実行文の文番号


IF ( e ) s1, s2, s3

説明

IF 文は算術式の値が負か、ゼロか、正かに応じて、それぞれ第 1、第 2、および第 3 文番号に制御を渡します。

制限事項は次のとおりです。

	N = 0 
	IF ( N ) 10, 20, 30 


N の値はゼロなので、制御は文番号 20 に渡されます。

IF (ブロック)

ブロック IF 文は、論理式の値に応じて複数の文の集合から 1 つを選択して実行します。

IF ( e ) THEN

...

END IF

パラメータ
説明
e
論理式


説明

ブロック IF 文は論理式を評価し、論理式が真のとき IF ブロックと呼ばれる 1 組の文を実行します。論理式が偽のとき、制御は同じ IF の深さの次の ELSE、ELSE IFEND IF 文に渡されます。

IF の深さ

SIF の深さは、n1-n2 の値です。ここで n1 はプログラム単位の最初から S までの S を含むブロック IF 文の数です。n2 はプログラム単位の中の S までの END IF 文の数です。S は含みません。

例 : 次のプログラムの中の文 9 の IF の深さは 2-1、つまり 1 です。

	IF ( X .LT. 0.0 ) THEN 
	MIN = NODE 
	END IF 
	... 
9	IF ( Y .LT. 0.0 ) THEN 
	MIN = NODE - 1 
	END IF 

あらゆる文の IF の深さは、ゼロか正の値です。IF、ELSE IF、ELSEEND IF 文の各ブロックの IF の深さは、正の値でなければなりません。各プログラム単位の END 文の IF の深さは、ゼロでなければなりません。

IF ブロック

IF ブロックは、ブロック IF 文からそのブロック IF 文と同じ IF の深さを持った次の ELSE、ELSE IF、または END IF 文までのすべての実行文 (ただし ELSE、ELSE IFEND IF を含まない) で構成されています。IF ブロックは空のことがあります。次の例では、2 つの代入文が IF ブロックを構成します。

	IF ( X .LT. Y ) THEN 
	M = 0 
	N = N+1 
	END IF

以下のように実行されます。

1. 論理式 e が最初に評価されます。e が真のとき、IF ブロックの最初の文から実行されます。

2. e が真で IF ブロックが空のとき、制御はブロック IF 文と同じ IF の深さを持つ次の END IF 文 に渡されます。

3. e が偽のときは、制御はブロック IF 文と同じ IF の深さを持つ次の ELSE IFELSE、または END IF 文に渡されます。

4. IF ブロックの最後の文が、文番号への分岐にならなかった場合、制御はその IF ブロックの前のブロック IF 文と同じ IF の深さを持つ、次の END IF 文に渡されます。

制限事項

IF ブロックの外部からその IF ブロックに分岐することはできません。


例 1 : IF-THEN-ELSE

	IF ( L ) THEN 
	N=N+1 
	CALL CALC 
	ELSE 
	K=K+1 
	CALL DISP 
	END IF 


例 2 : ELSE-IF を含む IF-THEN-ELSE-IF

	IF ( C .EQ. 'a' ) THEN 
	NA=NA+1 
	CALL APPEND 
	ELSE IF ( C .EQ. 'b' ) THEN 
	NB=NB+1 
	CALL BEFORE 
	ELSE IF ( C .EQ. 'c' ) THEN 
	NC=NC+1 
	CALL CENTER 
	END IF


例 3 : 入れ子にされた IF-THEN-ELSE

	IF ( PRESSURE .GT 1000.0 ) THEN 
	IF ( N .LT. 0.0 ) THEN 
	X = 0.0 
	Y = 0.0 
	ELSE 
	Z = 0.0 
	END IF 
	ELSE IF ( TEMPERATURE .GT. 547.0 ) THEN 
	Z = 1.0 
	ELSE 
	X = 1.0 
	Y = 1.0 
	END IF 


IF (論理)

論理 IF 文は、論理式の値に応じて 1 つの文を実行するかしないかを決定します。

パラメータ
説明
e
論理式
st
実行文


IF ( e ) st

説明

論理 IF 文は論理式を評価し、論理式の値が真のときは指定された文を実行します。論理式の値が偽のときは指定された文は実行されず、CONTINUE 文が実行されたように実行が継続されます。

st は任意の実行文です。DO ブロック、IF、ELSE IF、ELSE、END IF、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) ©


パラメータ 説明
BYTE ©
CHARACTER 
CHARACTER*n (n は 1 以上であること)
CHARACTER*(*) 
COMPLEX   
COMPLEX*8 ©
COMPLEX*16 ©
COMPLEX*32 ©(SPARCのみ)
DOUBLE COMPLEX ©
DOUBLE PRECISION    
INTEGER      
INTEGER*2 ©
INTEGER*4 ©
INTEGER*8 ©
LOGICAL 
LOGICAL*1 ©
LOGICAL*2 ©
LOGICAL*4 ©
LOGICAL*8 ©
REAL 
REAL*4 ©
REAL*8 ©
REAL*16 ©(SPARCのみ)
AUTOMATIC ©
STATIC ©

a
1 文字の英文字、またはアルファベット順に並んだ 1 文字ずつ
の英文字の範囲。英文字の範囲は、マイナス記号で区切られた最
初と最後の文字で指定される。


説明

暗黙の型宣言と非暗黙の型宣言の違いは、次のとおりです。

暗黙の型宣言

IMPLICIT 文は、プログラム単位内に暗黙の型宣言規則を適用しないことも宣言できます。

IMPLICIT 文は、その指定の中に現れる英文字 (1 つの英文字またはある範囲の英文字) で始まるすべてのユーザー定義の名前について型と大きさを宣言します。

IMPLICIT 文は、組み込み関数の型を変更しません。

IMPLICIT 文は、IMPLICIT 文を含むプログラム単位の中でだけ適用されます。

プログラム単位は、2 つ以上の IMPLICIT 文を含むことができます。

型宣言文によって宣言されたユーザー定義の名前に対しては、IMPLICIT 文の宣言は無効になります。


注 - オプション -dbl-i2-r8、または -xtypemap のいずれかを指定してコンパイルすると、IMPLICIT REAL (A-Z) のようにサイズを指定しない IMPLICIT 文によって型宣言された名前の想定サイズが変更されることがあります。詳細については、第 2 章「データ型とデータ項目」と『Fortran ユーザーズガイド』を参照してください。

非暗黙の型宣言

IMPLICIT 文の第 2 の形式は、ユーザー定義の名前に暗黙の型宣言を適用しないこと、およびすべてのユーザー定義の名前は明示的に宣言された型を持つことを指定します。

IMPLICIT NONE または IMPLICIT UNDEFINED (A-Z) が指定された場合には、プログラム単位内に他の IMPLICIT 文は存在できません。

制限事項

IMPLICIT 文は、他のすべての宣言文の前になければなりません。

同じ英文字が 1 つの英文字、またはある範囲の英文字群として、1 つのプログラム単位のすべての IMPLICIT 文の中に 2 回以上現れてもかまいません。©

FORTRAN 77 規格は、これを 1 回だけに制限しています。f77 の場合には、英文字が 2 回以上使用されると使用のたびに順番に宣言されます。例 4 を参照してください。


例 1 : IMPLICIT、すべてが整数

	IMPLICIT INTEGER (A-Z) 
	X = 3 
	K = 1 
	STRING = 0 


例 2 : U、V、または W で始まる場合は複素数、C または S で始まる場合は文字

	IMPLICIT COMPLEX (U,V,W), CHARACTER*4 (C,S) 
	U1 = ( 1.0, 3.0) 
	STRING = 'abcd' 
	I = 0 
	X = 0.0 


例 3 : すべての項目に宣言が必要な例

	IMPLICIT NONE 
	CHARACTER STR*8 
	INTEGER N 
	REAL Y 
	N = 100 
	Y = 1.0E5 
	STR = 'Length' 


上記の例のように最初に IMPLICIT NONE が指定されると、すべての変数が明示的に宣言されなければなりません。

例 4 : 英文字を 2 回使用 ©

	IMPLICIT INTEGER (A-Z)
	IMPLICIT REAL (A-C)
	C = 1.5E8
	D = 9


上記の例で A-ZINTEGER を、A-CREAL を意味します。

INCLUDE

INCLUDE © 文は、ファイルを原始プログラムに挿入します。

パラメータ
説明
file
挿入されるファイルの名前


INCLUDE 'file'

INCLUDE "file"

説明

名前を指定されたファイルの内容が INCLUDE 文に置き換えられます。

探索パス

INCLUDE 文で引用されている名前が文字 / で始まる場合、f77INCLUDE ファイルの絶対パス名を意味するものと解釈します。それ以外の場合、f77 は次に示す順序で以下のディレクトリの中からファイルを探します。

  1. INCLUDE 文を持つ原始ファイルを含むディレクトリ。

  2. -Iloc オプションで名前を指定されたディレクトリ。

  3. f77 のコマンドが出された現在のディレクトリ。

  4. デフォルトリストのディレクトリ。標準インストールの場合、デフォルトリストは次のようになります。

 	/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 論理ファイル名を解釈します。

f77 は解釈のため以下の規則を使用します。

ここで各 lname は論理名、path1、path2 はディレクトリのパス名 (終わりの '/' は付かない) です。

例 1 : 基本的な INCLUDE の例

	INCLUDE 'stuff'


これはファイル stuff の内容に置換されます。
例 2 : INCLUDE の探索パス
条件は次のとおりです。

  • ソースファイルが次の行を持つ

    	INCLUDE 'ver1/const.h' 
    


  • 現在のディレクトリが、/usr/ftn
  • ソースファイルが、/usr/ftn/projA/myprg.f

上記の場合、f77 は 以下に示す順序でこれらのディレクトリの中の const.h を探します。

標準インストールの場合、f77 は以下のディレクトリを探索します。

ディレクトリ /mydir への非標準インストールの場合は、/opt/mydir に置き換えます。<release> パスは、コンパイラのリリースごとに変わります。

INQUIRE

INQUIREは、装置またはファイルについての情報を返します。

INQUIRE( [ UNIT=] u, slist )

パラメータ
説明
fn
問い合わせされるファイルの名前
u
問い合わせされるファイルの番号
slist
指定子並び。下記の中の 1 つまたは複数を任意の順で含むことができる。
  • ERR = s
  • EXIST = ex
  • OPENED = od
  • NAMED = nmd
  • ACCESS = acc
  • SEQUENTIAL = seq
  • DIRECT = dir
  • FORM = fm
  • FORMATTED = fmt
  • UNFORMATTED = unf
  • NAME = fn
  • BLANK = blnk
  • IOSTAT = ios
  • NUMBER = num
  • RECL = rcl
  • NEXTREC = nr


INQUIRE( FILE= fn, slist )

説明

ファイルが存在するか、開かれているか、または順番入出力に結合されているかを確認できます。ファイルは名前、存在する (またはしない)、および特定の方法 (FORMATTED、UNFORMATTED、SEQUENTIAL、または DIRECT) で結合可能か否かなどの属性を持ちます。

装置またはファイル名で問い合わせを行うことができますが、同一の文の中で両方で問い合わせることはできません。

このシステム環境の中で、あるファイルに関してユーザーが持つアクセス権を知る唯一の方法は、ACCESS(3F) 関数を使用することです。INQUIRE 文では、アクセス権を検出できません。

次の表は、INQUIRE 文の指定子についてまとめたものです。

表 4-1   INQUIRE 文の指定子 
形式:指定子=変数
指定子 変数の値 変数のデータ型
ACCESS
'DIRECT'
'SEQUENTIAL'
CHARACTER
BLANK
'NULL','ZERO'
CHARACTER
DIRECT *
'YES'
'NO'
'UNKNOWN'
CHARACTER
ERR
文番号 INTEGER
EXIST
.TRUE., .FALSE.
LOGICAL
FORM
'FORMATTED'
'UNFORMATTED'
'BINARY'©
CHARACTER
FORMATTED *
'YES'
'NO'
'UNKNOWN'
CHARACTER
IOSTAT
エラー番号 INTEGER
NAME
ファイルの名前 CHARACTER
NAMED
.TRUE., .FALSE.
LOGICAL
NEXTREC
次記録番号 INTEGER
NUMBER *
装置番号 INTEGER
OPENED
.TRUE., .FALSE.
LOGICAL
RECL
記録長 INTEGER
SEQUENTIAL *
'YES'
'NO'
'UNKNOWN'
CHARACTER
UNFORMATTED *
'YES'
'NO'
'UNKNOWN'
CHARACTER


は、装置による問い合わせが規格外であるが、f77 では受け付けられることを示す。

は、ファイルによる問い合わせが規格外であるが、f77 では受け付けられることを示す。

INQUIRE 指定子のキーワード

INQUIRE 指定子のキーワードに関する詳細は以下のとおりです。

ACCESS = acc
BLANK = blnk
DIRECT = dir
ERR = s
EXIST = ex
FILE = fn
FORM = fm
FORMATTED = fmt
IOSTAT = ios
NAME = fn
NAMED = nmd
NEXTREC = nr
NUMBER = num
OPENED = od
RECL = rcl
SEQUENCIAL = seq
UNFORMATTED = unf
UNIT = u

例 1 : 装置による問い合わせ

	LOGICAL OK 
	INQUIRE( UNIT=3, OPENED=OK ) 
	IF ( OK ) CALL GETSTD ( 3, STDS ) 


例 2 : ファイルによる問い合わせ

	LOGICAL THERE 
	INQUIRE( FILE='.profile', EXIST=THERE ) 
	IF ( THERE ) CALL GETPROFILE( FC, PROFILE ) 


例 3 : 複数の応答、UNIT= を省略

	CHARACTER FN*32 
	LOGICAL HASNAME, OK 
	INQUIRE ( 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/]] ...

説明

宣言としては、INTEGERINTEGER*2INTEGER*4INTEGER*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
関数名


INTRINSIC fun [, fun ] ...

説明

組み込み関数の名前を実引数として使用する場合、それらは同一プログラム単位内の INTRINSIC 文に書かれていなければなりません。

例 : 次の例は実引数として引き渡される組み込み関数です。

	INTRINSIC SIN, COS 
	X = CALC ( SIN, COS ) 

制限事項

1 つの英字名は同一プログラム単位内の EXTERNAL 文と INTRINSIC 文のどちらか一方でしか使用できません。

実引数は個別名でなければなりません。ほとんどの総称名は個別名と同じですが、IMAG、LOG、LOG10 のようにそうでないものもあります。

英字名は INTRINSIC 文で 2 回以上使用することができます。ただし、FORTRAN 77 規格では 1 回に限定されています。©

以下の表の組み込み関数はインラインまたは総称なので実引数として引き渡すことはできません。

表 4-2   実引数にできない組み込み関数
LOC
AND
IAND
IIAND
JIAND
OR
IOR
IIOR
IEOR
IIEOR
JIOR
JIEOR
NOT
INOT
JNOT
XOR
LSHIFT
RSHIFT
LRSHFT
INT
IINT
JINT
IQINT
IIQINT
JIQINT
IFIX
IIFIX
JIFIX
IDINT
IIDINT
JIDINT
FLOAT
FLOATI
FLOATJ
DFLOAT
DFLOTI
DFLOTJ
IZEXT
SNGL
SNGLQ
REAL
DREAL
DBLE
DBLEQ
QEXT
QEXTD
QFLOAT
CMPLX
DCMPLX
ICHAR
IACHAR
ACHAR
CHAR
MAX
MAX0
AMAX0
JZEXT
AIMAX0
AJMAX0
IMAX0
JMAX0
MAX1
AMAX1
DMAX1
IMAX1
JMAX1
QMAX1
MIN
MIN0
AMIN0
AIMIN0
AJMIN0
IMIN0
JMIN0
MIN1
ZEXT
AMIN1
DMIN1
IMIN1
JMIN1
QMIN1
IMAG
LOG
LOG10
QREAL
QCMPLX
SIZEOF
EPBASE
EPEMAX
EPEMIN
EPHUGE
EPMRSP
EPPREC
EPTINY


LOGICAL

LOGICAL 文は、定数名、変数、配列、関数、仮関数の型を論理型に宣言します。

また配列の形状を指定し、初期値を与えることもできます。

パラメータ
説明
v
定数名、変数、配列、配列宣言子、関数または仮関数の名前
len
定数名、変数、配列要素または関数のバイト単位の長さで、1、2、4、8 のいずれか。8 は -dbl オプションがオンの場合のみ指定できます。©
c
この前にくる名前の定数の並び


LOGICAL [*len[,]] v[* len [/c/]] [, v [* len [/c/]] ...

説明

宣言としては、LOGICALLOGICAL*1LOGICAL*2LOGICAL*4LOGICAL*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 


説明

欄宣言は次のどれかです。


例 : MAP

	STRUCTURE /STUDENT/ 
	CHARACTER*32  NAME 
	INTEGER*2  CLASS 
	UNION 
	MAP 
		CHARACTER*16 MAJOR 
	END MAP 
	MAP 
		INTEGER*2  CREDITS 
		CHARACTER*8  GRAD_DATE 
	END MAP 
	END UNION 
	END STRUCTURE

NAMELIST

NAMELIST © 文は変数または配列名の並びを定義し、それを一意のグループ名と関連付けます。

パラメータ
説明
grname
グループの英字名
namelist
変数と配列の並び


NAMELIST / grname / namelist [[,] / grname / namelist ] ...

説明

NAMELIST 文に含まれる、グループ名および変数群について説明します。

グループ名

グループ名は変数群入出力文で使用され、読み取りまたは書き込みの対象となる変数または配列の並びを示します。変数群入出力文では入出力並びの代わりにこの名前が使用されます。グループ名は一意とし、読み取りまたは書き込みの可能な項目の並びを表します。

同一グループの変数はいくつかの NAMELIST 文によって別々に同一のグループ名で定義できます。これらの定義はまとめて 1 つの NAMELIST によるグループの定義とみなされます。

変数群の項目

変数群の項目は任意のデータ型とすることができます。

変数群の項目には変数または配列を指定することができ、これらの項目は複数の変数群に属することができます。変数群で指定された項目に限り変数群入出力での読み取りまたは書き込みが可能ですが、すべての項目に対して入力記録の中のデータを指定する必要はありません。

変数群の項目の順序により変数群出力への値の書き込み順序が制御されます。入力記録中では、項目はどのような順序で並んでいてもかまいません。

制限事項

入力データは、変数群に現れる配列の要素または文字列の部分列に値を割り当てることができます。

NAMELIST 文 に以下のものを使用することはできません。


例 : NAMELIST

	CHARACTER*16 SAMPLE 
	LOGICAL*4 NEW 
	REAL*4 DELTA 
	NAMELIST /CASE/ SAMPLE, NEW, DELTA 

この例ではグループ CASESAMPLE、NEW、DELTA の 3 つの変数で構成されます。

OPEN

OPEN 文は、既存の外部ファイルを装置に結合したり、ファイルを作成して装置に結合したり、あるいは結合の指定子を変更します。

OPEN ([UNIT=] u, slist)

パラメータ 説明
UNIT
slist
装置番号
slist の指定子の並びには、以下のうち 1 つ以上が入ります。

  • FILE = fin または代替形式として NAME = fin

  • ACCESS = acc

  • BLANK = blnk

  • ERR = s

  • FORM = fm

  • IOSTAT = ios

  • RECL = rl または代替形式として RECORDSIZE = rl

  • STATUS = sta または代替形式として TYPE = sta

  • FILEOPT = fopt ©

  • READONLY ©

  • ACTION = act ©


  • 説明

    OPEN 文は名前を指定されたファイルの型を決め、指定された結合がそのファイルの型に対して正当か不当かを判断します (たとえば DIRECT アクセスは磁気テープと tty デバイスに対しては不当となります)。ファイルが磁気テープ上にある場合、またはサブパラメータ FILEOPT='BUFFER=n' が指定された場合は、その結合にバッファを割り当てます。既存のファイルが開処理で不完全なものになることは決してありません。


    注 - テープ入出力の場合、TOPEN() ルーチンを使用します。

    以下の表は各 OPEN キーワード指定子について詳しくまとめたものです。

    表 4-3   OPEN 文の指定子
    形式 : 指定子 = 変数

    指定子 変数の値 変数のデータ型
    ACCESS 'APPEND'
    'DIRECT'
    'SEQUENTIAL'
    CHARACTER
    ACTION 'READ'
    'WRITE'
    'READWRITE'
    CHARACTER
    BLANK 'NULL'
    'ZERO'
    CHARACTER
    ERR 文番号 INTEGER
    FORM 'FORMATTED'
    'UNFORMATTED'
    'PRINT'
    'BINARY'©
    CHARACTER
    FILE ファイル名 CHARACTER
    FILEOPT 'NOPAD'
    'BUFFER=n'
    'EOF'
    CHARACTER
    IOSTAT エラー番号 INTEGER
    READONLY - -
    RECL 記録長 INTEGER
    STATUS 'OLD'
    'NEW'
    'UNKNOWN'
    'SCRATCH'
    CHARACTER


    以上の指定子キーワードの指定順序は自由です。

    OPEN 指定子キーワード

    以下に、OPEN 指定子キーワードについて詳しく説明します。

    [UNIT=] u
    FILE= fin

    ファイル名を指定せずに (または前のファイル名で)、一度開いた装置を再び開こうとすると、Fortran はユーザーがパラメータ変更のためにファイルを開きなおそうとしているものと解釈します。ファイルの位置は変わりません。
    ユーザーが変更できるパラメータは BLANK (NULL または ZERO) と FORM (FORMATTED または PRINT) だけです。その他のパラメータを変更する場合はファイルを一度閉じてから開きなおします。

    すでに開かれている装置を再び開く際に前と異なるファイル名を指定した場合は、開く前に旧ファイル名で閉じたのと同じ状態になります。

    すでに開かれているファイルを再び開く際に前と異なる装置を指定した場合は誤りとなります。ただし、この誤りは ERR= オプションでは検出されないため、プログラムは異常終了しません。

    ファイルが STATUS='SCRATCH' で開かれると、一時ファイルが作成および開かれます。STATUS=sta を参照してください。

    ACCESS= acc
    FORM= fm
    RECL= rl
    ERR= s
    IOSTAT= ios
    BLANK= blnk
    STATUS= sta
    FILEOPT= fopt ©
    READONLY ©
    ACTION = act

    以下に例を示します。

    例 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 ) 
    


    上記の例では順番探査、書式付きファイルで、ファイルを開く時に誤りを想定しません。実行するにあたって、ファイル fort.8 が存在しない場合は fort.8 が作成されます。このファイルは終了後も残ります。

    例 4 : 開く時の誤りを想定します。

    	OPEN( UNIT=8, FILE='projectA/data.test', ERR=99 )
    


    上記の文では、OPEN 文の実行時に誤りが生じた場合は文番号 99 に分岐します。

    例 5 : 変数長記録を許可します。

    	OPEN( 1, ACCESS='DIRECT', recl=1 )
    


    可変長記録に関する詳細については、「直接探査入出力」を参照してください。

    例 6 : 一時ファイル

    	OPEN( 1, STATUS='SCRATCH' )
    


    この文は、tmp.FAAAa003zU などの名前の一時ファイルを開きます。このファイルは通常、現在の作業ディレクトリか、(設定されていれば) TMPDIR 変数の指すディレクトリに作成されます。

    OPTIONS

    OPTIONS © 文はコンパイラのコマンド行オプションを無効にします。

    OPTIONS /修飾子  [/修飾子 ...] 
    

    説明

    以下の表に、OPTIONS 文の修飾子を示します。

    表 4-4   OPTIONS 文の修飾子 
    修飾子 処置
    /[NO]G_FLOATING 
    
    何もしない (機能なし)
    
    /[NO]I4 
    
    -i2 オプションの指定を許可または禁止する
    
    /[NO]F77 
    
    何もしない (機能なし)
    
    /CHECK=ALL 
    
    -C オプションの指定を許可する
    
    /CHECK=[NO]OVERFLOW 
    
    何もしない (機能なし)
    
    /CHECK=[NO]BOUNDS 
    
    -C オプションの指定を許可または禁止する
    
    /CHECK=[NO]UNDERFLOW 
    
    何もしない (機能なし)
    
    /CHECK=NONE 
    
    -C オプションの指定を禁止する
    
    /NOCHECK 
    
    -C オプションの指定を禁止する
    
    /[NO]EXTEND_SOURCE 
    
    -e オプションの指定を許可または禁止する
    


    制限事項

    OPTIONS 文はプログラム単位の先頭に置かなくてはなりません。つまり BLOCK DATA 文、FUNCTION 文、PROGRAM 文、SUBROUTINE 文の前ということです。

    OPTIONS 文により設定されたオプションは、コマンド行に指定したオプションを無効にします。

    OPTIONS 文により設定されたオプションは、そのプログラム単位内でのみ有効です。

    修飾子は 4 文字以上の省略形にすることができます。

    大文字/小文字の区別はありません。


    次の例ではサイズを明示されずに宣言された整変数は、コマンド行の -i2 オプションの有無にかかわらず、2 バイトではなく 4 バイトを占めます。これによって整定数のサイズは変更されず、変数のサイズだけが変更されます。

    	OPTIONS /I4 
    
    	PROGRAM FFT 
    
    	... 
    
    	END 
    

    これに対し /NOI4 を使用した場合は、サイズを明示されずに宣言されたすべての整変数は、コマンド行の -i2 オプションの有無にかかわらず、4 バイトではなく 2 バイトを占めます。整定数は、-i2 オプションがある場合は 2 バイト、ない場合は 4 バイトとなります。

    PARAMETER

    PARAMETER 文は定数に英字名を割り当てます。

    パラメータ
    説明
    p
    英字名
    e
    定数式


    PARAMETER ( 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*10 
    
    	LOGICAL T 
    
    	PARAMETER (EPSILON=1.0E-6, PI=3.141593, 
    
    &	HEADING=' IO Error #', 
    
    &	T=.TRUE. ) 
    
    	... 
    


    例 2 : コンパイラに文字数をカウントさせます。

    	CHARACTER HEADING*(*) 
    
    	PARAMETER ( HEADING='入出力エラー番号' ) 
    
    	... 
    


    例 3 : -xl コンパイルフラグを指定した場合の代替構文

    	PARAMETER FLAG1 = .TRUE. 
    


    上記の文は次のように取り扱われます。

    	LOGICAL FLAG1 
    
    	PARAMETER (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.f 
    
    	PRINT *, "Start" 
    
    	PAUSE 1 
    
    	PRINT *, "Ok" 
    
    	END 
    
    demo% f77 p.f -silent
    
    demo% a.out 
    
    Start 
    
    PAUSE: 1 
    
    実行を再開するには、go と入力します。 
    
    その他の入力では、プログラムを中止します。 
    
    go 
    
    PAUSE の後に実行を再開しました。 
    
    Ok 
    
    demo% 
    

    stdintty 入出力装置ではない場合、PAUSE は次の形式のメッセージを表示します。

    PAUSE: 実行を再開するには、kill -15 pid と入力します。
    

    ここで pid はプロセス識別子です。

    例 : stdintty 入出力装置ではない場合

    demo% a.out < mydatafile 
    
    PAUSE: 実行を再開するには、kill -15 20537 と入力します。
    
    demo% 
    

    メッセージを表示するウィンドウはコマンド入力を受け取ることができないため、上記の例では他のウィンドウのシェルプロンプトに以下のコマンド行を入力します 。

    demo% kill -15 20537 
    

    POINTER

    POINTER © 文は変数とポインタの対を確立します。

    パラメータ
    説明
    v1, v2
    ポインタ基底付き変数、指示先とも言う
    p1, p2
    対応するポインタ


    POINTER ( p1, v1 ) [, ( p2, v2 ) ... ]

    説明

    各ポインタの内容は対応する変数のアドレスです。

    ポインタ基底付き変数、すなわち指示先は POINTER 文によりポインタと対になった変数です。通常はポインタ基底付き変数のことを単に基底付き変数と言います。ポインタはアドレスを内容とする整変数です。(POINTER 文で指定する変数名は、コンパイラでは VOLATILE と見なされます)

    ポインタの使用法については、「ポインタ」を参照してください。


    例 1 : 単純な POINTER

    	POINTER ( P, V ) 
    


    ここで V はポインタ基底付き変数で、P はその関連付けられたポインタです。

    例 2 : LOC() 関数によるアドレスの獲得

    	* ptr1.f: LOC() を介してアドレスを割り当てる
    
    	POINTER ( P, V ) 
    
    	CHARACTER A*12, V*12 
    
    	DATA A / 'ABCDEFGHIJKL' / 
    
    	P = LOC( A ) 
    
    	PRINT *, V(5:5) 
    
    	END 
    


    上記の例では CHARACTER 文は A に 12 バイトの記憶領域を割り当てますが、V には記憶領域を割り当てません。V はポインタ基底付き変数なので、型だけを指定します。次に A のアドレスを P に割り当てます。それによって、V を使用するとポインタ P によって A が引用されます。プログラムは E を出力します。

    例 3 : MALLOC によるポインタへの記憶域割り当て

    	POINTER ( P1, X ), ( P2, Y ), ( P3, Z ) 
    
    	... 
    
    	P1 = MALLOC ( 36 ) 
    
    	... 
    
    	CALL FREE ( P1 ) 
    
    	... 
    


    上記の例では MALLOC() で 36 バイトの記憶領域を獲得し、他の命令をいくつか実行し、おそらくこの一連の記憶領域を使用する命令をいくつか実行した後、この 36 バイトをメモリーマネージャに戻すように FREE() に指示します。

    例 4 : 記憶領域とそのアドレスの獲得

    	POINTER ( P, V ) 
    
    	CHARACTER V*12, Z*1 
    
    	P = MALLOC( 12 ) 
    
    	... 
    
    	END 
    


    上記の例では関数 MALLOC() で 12 バイトの記憶領域を獲得し、その記憶領域のアドレスをポインタ P に割り当てます。

    例 5 : 配列の動的割り当て

    	PROGRAM UsePointers 
    
    	REAL X 
    
    	POINTER ( P, X ) 
    
    	... 
    
    	READ ( *,* ) Nsize 	! サイズを取得 
    
    	P = MALLOC( Nsize )	! メモリーを割り当てる 
    
    	... 
    
    	CALL CALC ( X, Nsize ) 
    
    	... 
    
    	END 
    
    	SUBROUTINE CALC ( A, N ) 
    
    	REAL A(N) 
    
    	...		! どのようなサイズの配列でも使用する
    
    	RETURN 
    
    	END 
    


    この例は今までの例と異なり、やや現実的な形式をとっています。大きさは、たとえば
    10,000 のように非常に大きな数値をとることができます。サブルーチンは、一度配列が割り当てられてしまうと、それが動的に割り当てられたことを知らずに動作します。

    例 6 : ポインタを使用して、f77 でリンクリストを作成する

    demo% cat Linked.f
    
    	STRUCTURE /NodeType/
    
    	INTEGER 			recnum
    
    	CHARACTER*3 			label
    
    	INTEGER			 next
    
    	END STRUCTURE
    
    	RECORD /NodeType/ r, b
    
    	POINTER (pr,r), (pb,b)
    
    	pb = malloc(12)			 基準記録 b を作成
    
    	pr = pb				pr は b を指示
    
    	NodeNum = 1 	
    
    	DO WHILE (NodeNum .LE. 4)	記録の初期化と作成
    
    	IF (NodeNum .NE. 1) pr = r.next
    
    	CALL struct_creat(pr,NodeNum)
    
    	NodeNum = NodeNum + 1
    
    	END DO
    
    	r.next = 0
    
    	pr = pb 			  全記録を表示
    
    	DO WHILE (pr .NE. 0)
    
    	PRINT *, r.recnum, " ", r.label
    
    	pr = r.next
    
    	END DO
    
    	END
    
    	SUBROUTINE struct_creat(pr,Num)
    
    	STRUCTURE /NodeType/
    
    	INTEGER 	recnum
    
    	CHARACTER*3 	label
    
    	INTEGER 	next
    
    	END STRUCTURE
    
    
     
    
    	RECORD /NodeType/ r
    
    	POINTER (pr,r), (pb,b)
    
    	CHARACTER v*3(4)/'aaa', 'bbb', 'ccc', 'ddd'/
    
    
     
    
    	r.recnum = Num 		現在の記録を初期化
    
    	r.label = v(Num)
    
    	pb = malloc(12) 	 	次の記録を作成
    
    	r.next = pb
    
    	RETURN
    
    	END
    


    
    
    

      

    demo% f77 -silent Linked.f
    
    "Linked.f", line 6: 警告:  局所変数"b" が使用されていません。
    
    "Linked.f", line 31: 警告:  局所変数"b" が使用されていません。
    
    demo% a.out
    
       1 aaa
    
       2 bbb
    
       3 ccc
    
       4 ddd
    
    demo% 
    

     

    以下の点に注意してください。

    PRINT

    PRINT 文は並びから標準出力への書き込みを実行します。

    PRINT f [, iolist ]

    パラメータ
    説明
    f
    書式識別子
    iolist
    変数、部分列、配列、記録の並び
    grname
    変数群の名前


    PRINT grname

    説明

    PRINT 文は以下の引数をとります。

    書式識別子

    f は書式識別子で、以下のものが使用できます。

    出力並び

    iolist は、空の場合と、出力並びと DO 型並びの両方または一方を含む場合があります。出力並びは以下のいずれかです。

    添字なしで単に配列名だけを書けば、記憶領域へ格納されている順に (左端の添字が他より速く増加する) 配列の全要素が指定されます。

    DO 型並びの詳細については、「DO 型並び」を参照してください。

    変数群 PRINT

    PRINT 文の第 2 の形式は指定された変数群の項目を出力するために使用されます。ここで grnameNAMELIST 文で先に定義されている変数群の名前です。

    実行手順は以下のとおりです。

    1. 書式が指定されていればそれが確立されます。

    2. 出力並びが空でなければその並びから標準出力へデータが転送されます。

    書式が指定されているとそれに応じてデータが編集されます。

    3. PRINT 文の第 2 の形式では、指定された変数群の項目から標準出力へデータが転送されます。

    制限事項

    例外ハンドラからの出力は予測できません。ユーザー自身の例外ハンドラを作成する場合、そのハンドラから Fortran 77 出力を行わないでください。どうしても必要な場合は、出力直後に異常終了を呼び出します。こうすることによって、システムが凍結する危険を減らすことができます。例外ハンドラからの Fortran 77 入出力は再帰的な入出力です。次の段落を参照してください。

    再帰的な入出力の動作は信頼できません。入出力リスト中に関数をリストして、その関数が 入出力を行う場合、実行時に実行が凍結するか、その他にも予測できない問題が発生する可能性があります。この危険は並列化に関わらず存在します。

    例 : 再帰的な入出力が断続的に失敗する。

    	PRINT *, x, f(x)      f() が入出力を行なうため、できない。
    
    	END
    
    	FUNCTION F(X)
    
    	PRINT *, X
    
    	RETURN
    
    	END
    


    例 1 : 書式付きスカラー

    	CHARACTER TEXT*16 
    
    	PRINT 1, NODE, TEXT 
    
    1	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*16 
    
    	REAL QUANTITY 
    
    	INTEGER NODE 
    
    	NAMELIST /SUMMARY/ LABEL, QUANTITY, NODE 
    
    	PRINT SUMMARY 
    


    PROGRAM

    PROGRAM 文は、プログラム単位を主プログラムとして識別します。

    パラメータ
    説明
    pgm
    主プログラムの英字名


    PROGRAM pgm

    説明

    ローダーにとって主プログラムの名前は常に MAIN です。PROGRAM 文はプログラムを読む人だけに役立つものです。

    制限事項

    PROGRAM 文は主プログラムの最初の文としてのみ使用できます。

    プログラムに次のような名前を付けることはできません。

    プログラムの名前は主プログラムでの局所名と同じにすることができます。© FORTRAN 77 規格ではこれができません。


    例 : PROGRAM

    	PROGRAM US_ECONOMY 
    
    	NVARS = 2 
    
    	NEQS = 2 
    
    	... 
    

    READ

    READ 文はファイルまたはキーボードから並びの項目へデータを読み取ります。


    注 - テープ装置からデータを読み取る場合は、TOPEN() ルーチンを使用します。『Fortran ライブラリ・リファレンス』を参照してください。

    READ([UNIT=] u [,[FMT=]f] [, IOSTAT=ios] [, REC=rn] [, END= s]
    [, ERR=s]) iolist

    READ f[, iolist]

    READ([UNIT=] u, [NML=] grname [,IOSTAT=ios] [,END=s] [,ERR=s] )

    READ grname

    パラメータ
    説明
    u
    ファイルに結合された装置の装置識別子
    f
    書式識別
    ios
    入出力状態指定子
    rn
    読み取られる記録番号
    s
    ファイル処理終了のための文番号
    iolist
    変数の並び
    grname
    変数群の名前


    UNIT=u,REC=rn の代替形式は以下のとおりです。©

    READ( u ' rn ... ) iolist

    オプションはどのような順番で指定してもかまいません。

    説明

    READ 文は以下の引数をとります。

    装置識別子

    u は外部装置識別子または内部ファイル識別子です。

    外部装置識別子には以下のどちらかを使用してください。

    装置指定子で省略可能な文字 UNIT= を省略する場合は、u を指定子の並びの最初の項目としなければなりません。

    書式識別子

    f は書式識別子で以下のどれかを使用します。

    実行時に評価される書式の詳細については、「実行時書式」を参照してください。

    書式指定子で省略可能な文字 FMT= を省略する場合、f は書式付き読み取りの第 2 の引数として現れるか、全く現れないかのどちらかでなければなりません。

    内部ファイルと端末ファイルから書式なしデータを転送することはできません。したがってこのようなファイルにとっては f が不可欠です。

    直接探査ファイルと内部ファイルから並びによるデータを転送することができます。したがってこのようなファイルの場合、f をアスタリスクにします。©

    ファイルが書式付き入出力に結合される場合、書式なしデータを転送することはできません。同様に、ファイルが書式なし入出力に結合されている場合は書式付きデータを転送することはできません。

    入出力状態指定子

    ios は整変数または整数の配列要素です。

    記録番号

    rn は正の整数式で、直接探査ファイルに限り使用できます。rn は内部ファイルに指定することもできます。©

    ファイル終了指定子

    sREAD 文のあるプログラム単位内の実行文の文番号です。

    END=sREC=rn の各指定子は READ 文で同時に指定できます。©

    誤り指定子

    sREAD 文のあるプログラム単位内の実行文の文番号です。

    入力並び

    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 に移されます。

    READ には次の 2 つの形式があります。

    READ f [, iolist ]
    READ [ NML= ] grname

    上記の 2 つの形式は、キーボードから読み取られることを除き、他と同じように動作します。

    上記の形式には、次のような違いがあります。

    u がファイルに結合されていない外部装置を指定した場合は暗黙の OPEN 操作が実行され、下記の例のオプションでファイルを開いた場合と同じ状態になります。

    OPEN( u, FILE='FORT.u', STATUS='OLD', ACCESS='SEQUENTIAL',
    &
    FORM=fmt )


    次の点にも注意してください。


    例 1 : 書式付き READ、入出力誤りのトラップ、ファイル終了、入出力状態

    	READ( 1, 2, ERR=8, END=9, IOSTAT=N ) X, Y 
    
    	... 
    
    8	WRITE( *, * ) '1 での入出力エラー番号:', N
    
    	STOP 
    
    9	WRITE( *, * ) '1 で EoF' 
    
    	RETURN 
    
    	END 
    


    例 2 : 直接、書式なし READ、入出力エラートラップ、入出力状態

    	READ( 1, REC=3, IOSTAT=N, ERR=8 ) V 
    
    	... 
    
    4	CONTINUE 
    
    	RETURN 
    
    8 	WRITE( *, * ) '1 での入出力エラー番号:', N 
    
    	END 
    


    例 3 : キーボードからの並びによる READ

    	READ( *, * ) A, V 
    
    または
    
    	READ *, A, V 
    


    例 4 : 内部ファイルからの書式付き READ

    	CHARACTER CA*16 / 'abcdefghijklmnop' /, L*8, R*8 
    
    	READ( CA, 1 ) L, R 
    
    1	FORMAT( 2 A8 ) 
    


    例 5 : 配列全体の読み取り

    	DIMENSION V(5) 
    
    	READ( 3, '(5F4.1)') V 
    


    例 6 : 変数群 READ

    	CHARACTER SAMPLE*16 
    
    	LOGICAL NEW*4 
    
    	REAL DELTA*4 
    
    	NAMELIST /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  R
    
    	REAL*16 Q
    
    	DOUBLE PRECISION D
    

    (REAL*16 は SPARC のみ)

    DR は倍精度です。Q は 4 倍精度です。

    RECORD

    RECORD © 文は指定された構造体を持つ変数を定義したり、指定された構造体を持つ変数の配列を定義します。

    パラメータ
    説明
    構造体名
    先に宣言されている構造体の名前
    記録の並び
    変数、配列、または配列宣言子


    RECORD /構造体名/ 記録の並び [,/構造体名/ 記録の並び]...

    説明

    構造体は記録のひな形です。構造体の名前は STRUCTURE 文にあり、STRUCTURE 文で一度定義され命名された構造体は、RECORD 文で使用することができます。

    記録は変数または配列を一般化したものです。変数や配列が型を持つように、記録は構造体を持ちます。配列の要素はすべて同じ型でなければなりませんが、記録欄の型は異なっていてもかまいません。

    RECORD 行は本来複数行に渡る文の集合の一部であり、RECORD 行と END RECORD 行のどちらも継続行はありません。6 桁目に空白以外の文字を入れたり、1 桁目に & を入れたりしないでください。

    構造体、フィールド、記録については、「構造体」を参照してください。

    制限事項

    例 1 : 指定した構造体の記録として複数の項目を宣言

    	STRUCTURE /PRODUCT/ 
    
    	INTEGER*4 ID 
    
    	CHARACTER*16 NAME 
    
    	CHARACTER*8 MODEL 
    
    	REAL*4 COST 
    
    	REAL*4 PRICE 
    
    	END STRUCTURE 
    
    	RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10)
    
    	...
    


    CURRENT、PRIOR、NEXT の各変数は PRODUCT という構造体を持つ記録です。LINE PRODUCT という構造体を持つ記録を 10 個含む配列です。

    例 2 : 記録の複数の欄を定義し、使用する

    	STRUCTURE /PRODUCT/
    
    	INTEGER*4    ID
    
    	CHARACTER*16 NAME
    
    	CHARACTER*8  MODEL
    
    	REAL*4       COST
    
    	REAL*4       PRICE
    
    	END STRUCTURE
    
    	RECORD /PRODUCT/  CURRENT, PRIOR, NEXT, LINE(10)
    
    	CURRENT.ID = 82
    
    	PRIOR.NAME = "CacheBoard"
    
    	NEXT.PRICE = 1000.00
    
    	LINE(2).MODEL = "96K"
    
    	PRINT 1, CURRENT.ID, PRIOR.NAME, NEXT.PRICE, LINE(2).MODEL
    
    1	FORMAT(1X I5/1X A16/1X F8.2/1X A8)
    
    	END
    


    上記のプログラムの出力は以下のようになります。

    82
    
    CacheBoard      
    
    1000.00
    
    96K   
    

    RETURN

    RETURN 文は呼び出し元のプログラム単位に制御を返します。

    RETURN [ e ]

    パラメータ
    説明
    e
    INTEGER 型または REAL 型の式


    説明

    RETURN 文を実行すると関数またはサブルーチンの引用が終了します。

    関数またはサブルーチンで END 文を実行すると RETURN 文を実行するのと同じ結果になります。©

    e という式は評価され、必要であれば整数に変換されます。e は使用する選択戻り文番号の順序を表します。選択戻り文番号は SUBROUTINE 文ではアスタリスク (またはアンパサンド ) © で指定されます。

    e が指定されていない場合、また e が 1 より小さいか RETURN 文を含む SUBROUTINE 文で指定されたアスタリスクまたはアンパサンドの数より大きい場合、制御はサブルーチンを呼び出した CALL 文の次の文に戻ります。

    e の値が 1 以上で SUBROUTINE 文で指定されたアスタリスク (またはアンパサンド) の数以下である場合、制御は e 番目の選択戻り文番号で識別される文に戻ります。RETURN 文は関数の副プログラムまたはサブルーチンにしか使用できません。


    例 1 : 標準的な戻り

    	CHARACTER*25 TEXT 
    
    	TEXT = "Some kind of minor catastrophe"
    
    	... 
    
    	CALL OOPS ( TEXT ) 
    
    	STOP 
    
    	END
    
    	SUBROUTINE OOPS ( S ) 
    
    	CHARACTER S* 32 
    
    	WRITE (*,*) S 
    
    	RETURN 
    
    	END 
    


    例 2 : 選択戻り

    	CALL RANK ( N, *8, *9 ) 
    
    	WRITE (*,*) 'OK - 正常戻り' 
    
    	STOP 
    
    8	WRITE (*,*) '非重要 - 最初の代替戻り' 
    
    	STOP 
    
    9	WRITE (*,*) '重要 - 2 番目の代替戻り' 
    
    	END 
    
    	SUBROUTINE RANK (N, *,*) 
    
    	IF ( N .EQ. 0 ) RETURN 
    
    	IF ( N .EQ. 1 ) RETURN 1 
    
    	RETURN 2 
    
    	END 
    


    REWIND

    REWIND 文は指定された装置に結合されたファイルをその始点に位置付けます。


    注 - テープ装置をまき戻す場合は、TOPEN() ルーチンを使用します。『Fortran ライブラリ・リファレンス』を参照してください。

    REWIND u

    REWIND ( [ UNIT=] u [, IOSTAT=ios ] [, ERR= s ])

    パラメータ
    説明
    u
    ファイルに結合された外部装置の装置識別子。順番探査または追加探査の際には u が結合されていること。
    ios
    入出力状態指定子。整変数または整数配列要素。
    s
    誤り指定子。sREWIND 文のあるプログラム内の実行文の文番号であること。REWIND 文の実行中にエラーが生じた場合、プログラムの制御はこの文番号に移される。


    説明

    オプションはどのような順番で指定してもかまいません。

    ファイルが結合されていない装置に REWIND 文を実行しても何も起こりません。

    端末ファイルで REWIND 文を実行しても何も起こりません。

    直接探査ファイル上での REWIND 文の使用は FORTRAN 77 規格では定義されておらず、その動作は予測できません。


    例 1 : 単純な形式の装置指定子

    	ENDFILE 3 
    
    	REWIND 3 
    
    	READ (3,'(I2)') I 
    
    	REWIND 3 
    
    	READ (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 以外の方法で副プログラムを出るルーチンでは、移植性が保証されます。

    制限事項

    以下のものを SAVE 文に入れることはできません。


    例 : SAVE

    	SUBROUTINE FFA(N)
    
    	DIMENSION A(1000,1000), V(1000) 
    
    	SAVE A 
    
    	... 
    
    	RETURN 
    
    	END 
    

    文関数

    文関数の定義文は関数に似た、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. 値が返されます。

    これにより、関数を引用した式が結果の値を使用できるようになります。

    制限事項

    制限事項は次のとおりです。


    例 1 : 算術文関数

    	PARAMETER ( PI=3.14159 ) 
    
    	REAL RADIUS, VOLUME 
    
    	SPHERE ( R ) = 4.0 * PI * (R**3) / 3.0 
    
    	READ *, RADIUS 
    
    	VOLUME = SPHERE( RADIUS ) 
    
    	... 
    


    例 2 : 論理文関数

    	LOGICAL OKFILE 
    
    	INTEGER STATUS 
    
    	OKFILE ( I ) = I .LT. 1 
    
    	READ( *, *, IOSTAT=STATUS ) X, Y 
    
    	IF ( OK FILE(STATUS) ) CALL CALC ( X, Y, A ) 
    
    	... 
    


    例 3 : 文字文関数

    	CHARACTER FIRST*1, STR*16, S*1
    
    	FIRST(S) = S(1:1) 
    
    	READ( *, * ) STR 
    
    	IF ( FIRST(STR) .LT. " " ) CALL CONTROL ( S, A ) 
    
    	... 
    


    STATIC

    STATIC © 文は指定した項目が必ず静的領域に格納されるようにします。

    パラメータ
    説明
    list
    変数と配列の並び


    STATIC list

    説明

    すべての局所変数と配列は、デフォルトでは静的であると分類されます。各データのコピーは 1 つだけ存在し、呼び出しと呼び出しの間でもその値は保持されます。STATIC 文または AUTOMATIC 文を使用して変数を明示的に静的変数または自動変数に定義することもできます。また型宣言文または IMPLICIT 文でも定義できます。

    しかし、移植性を保証するために STATIC を使用することができます。特に、RETURN 以外の方法で副プログラムを出るルーチンでは STATIC 文が有効です。

    さらに、次の点に注意してください。

    	STATIC A, B, C 
    
    	REAL P, D, Q 
    
    	STATIC P, D, Q 
    
    	IMPLICIT STATIC (X-Z) 
    


    STOP

    STOP 文はプログラムの実行を終了します。

    パラメータ
    説明
    str
    5 桁以下の文字列または文字定数


    STOP [ str ]

    説明

    プログラム終了時には引数 str が表示されます。

    str が指定されない場合にはメッセージは表示されません。


    例 1 : 整数

    	stop 9 
    


    上記の文は次を表示します。

    	STOP: 9 
    

    例 2 : 文字

    	stop 'エラー' 
    


    上記の文は次を表示します。

    	STOP: エラー 
    

    STRUCTURE

    STRUCTURE © 文はデータを構造体に編成します。

    STRUCTURE [/構造体名/] [ 欄の並び ]

    欄宣言

    欄宣言

    ...

    END STRUCTURE

    欄宣言は以下のうちのいずれかです。

    説明

    STRUCTURE 文は、記録を構成する欄の名前、型、サイズ、順序を指定することによって記録の形式を定義します。また、必要に応じて初期値を指定することもできます。

    構造体は記録用のテンプレートです。構造体の名前は STRUCTURE 文で定義され、このように一度 STRUCTURE 文で定義されて名付けられた構造体は RECORD 文で使用することができます。

    記録は変数または配列を一般化したものです。変数や配列が型を持つように、記録は構造体を持ちます。配列の要素はすべて同じ型でなければなりませんが、記録の欄の型は異なっていてもかまいません。

    構造体、欄、および記録については、「構造体」を参照してください。

    制限事項

    構造体の名前はスラッシュで囲みます。名前を省略できるのは入れ子にされた構造体だけです。

    スラッシュがある場合は、名前もなければなりません。

    欄の並びが指定できるのは入れ子にされた構造体内だけです。

    欄宣言は最低 1 つはなければなりません。

    各構造体名は構造体間で一意でなければなりません。ただし、構造体名を他の構造体内の欄の名前として使用したり、変数名として使用することはできます。

    STRUCTURE 文と END STRUCTURE 文の間に入れることのできる文は欄宣言文と PARAMETER 文だけです。構造体宣言ブロック内の PARAMETER 文はその外側にある PARAMETER 文と同じです。

    欄に関する制限事項

    欄宣言が型宣言の場合、通常の Fortran 77 の型宣言文と同じ構文を使用します。ここでは以下のような規則と制限に従えば、f77 のすべての型が許されます。

    構造体宣言では、欄のオフセット n はその前の欄のオフセットに前の欄の長さを足したもので、整列させるために調整されることもあります。

    変数、配列、部分列、部分構造体、共用体である欄は初期化することができます。


    例 1 : 5 つの欄からなる構造体

    	STRUCTURE /PRODUCT/ 
    
    	INTEGER*4 ID		/ 99 / 
    
    	CHARACTER*16 NAME 
    
    	CHARACTER*8 MODEL	/ 'Z' / 
    
    	REAL*4 COST 
    
    	REAL*4 PRICE 
    
    	END STRUCTURE 
    
    	RECORD /PRODUCT/ CURRENT, PRIOR, NEXT, LINE(10) 
    


    上記の例では、5 つの欄 ID、NAME、MODEL、COST、PRICE からなる PRODUCT という名前の構造体が定義されています。変数 CURRENT、PRIOR、NEXT はそれぞれ PRODUCT 構造体を持つ記録で、LINE はこのような記録を 10 個含む配列です。これらの記録の ID には 99、MODEL には Z という初期値が設定されます。

    例 2 : 2 つの欄からなる構造体

    	STRUCTURE /VARLENSTR/ 
    
    	INTEGER*4 NBYTES 
    
    	CHARACTER A*25 
    
    	END STRUCTURE 
    
    	RECORD /VARLENSTR/ VLS 
    
    	VLS.NBYTES = 0 
    


    SUBROUTINE

    SUBROUTINE 文は指定したプログラム単位をサブルーチンと識別し、その引数を指定します。

    パラメータ
    説明
    sub
    副プログラムの名前
    d
    変数名、配列名、記録名、仮手続き名、アスタリスク、アンパサンドのいずれか


    SUBROUTINE sub [ ( [ d [, d ] ... ])]

    説明

    副プログラムの最初の文は SUBROUTINE 文でなければなりません。サブルーチンには、BLOCK DATA、FUNCTION、PROGRAM、および別の SUBROUTINE 文を書くことはできません。

    sub はサブルーチン名で、大域名ですが、共通ブロック名や関数名といった他の大域名と同じであってはなりません。また、同じサブルーチン内の局所名と同じであってもなりません。

    d は仮引数です。仮引数が複数あるときにはそれぞれをコンマで区切ります。d は以下のうちのどれかです。

    仮引数はサブルーチンに対し局所的です。また、共通ブロック名以外として以下の文に現れることはできません。

    サブルーチンを引用する CALL 文の実引数は、SUBROUTINE 文の対応する仮引数の順序、数、型と一致しなければなりません。

    仮引数の並びのアスタリスク (またはアンパサンド) は選択戻り文番号を示します。どの選択戻り文を取るかはサブルーチン内の RETURN 文で指定できます。


    例 1 : 仮引数としての変数と配列

    	SUBROUTINE SHR ( A, B ) 
    
    	CHARACTER A*8 
    
    	REAL B(10,10) 
    
    	... 
    
    	RETURN 
    
    	END 
    


    例 2 : 規格に従った選択戻り

    	PROGRAM TESTALT 
    
    	CALL RANK ( N, *8, *9 ) 
    
    	WRITE (*,*)	'OK - 正常戻り [n=0]' 
    
    	STOP 
    
    8	WRITE (*,*)	'非重要 - 最初の代替戻り [n=1]' 
    
    	STOP 
    
    9	WRITE (*,*)	'重要 - 2 番目の代替戻り [n=2]' 
    
    	END 
    
    	SUBROUTINE RANK ( N, *, * ) 
    
    	IF ( N .EQ. 0 ) RETURN 
    
    	IF ( N .EQ. 1 ) RETURN 1 
    
    	RETURN 2 
    
    	END
    


    この例の RETURN 1 文は 最初の選択戻り文番号 (最初の *) を引用し、RETURN 2 文は SUBROUTINE 文で指定された 2 番目の選択戻り文番号 (2 番目の *) を引用します。

    TYPE

    TYPE © 文は標準出力に出力します。

    TYPE f [, iolist ]

    TYPE grname

    パラメータ
    説明
    f
    書式識別子
    iolist
    変数、部分列、配列、記録の並び
    grname
    変数群の名前


    説明

    TYPE 文は、互換性を保つために提供されており、以下は同じ働きをします。


    例 1 : 書式付き出力と変数群出力

    	INTEGER V(5) 
    
    	REAL X(9), Y
    
    	NAMELIST /GNAM/ X, Y
    
    	...
    
    	TYPE 1, V 
    
    1	FORMAT( 5 I3 )
    
    	...
    
    	TYPE GNAM
    
    	...
    


    型宣言文

    型宣言文は並びの各項目のデータ型を指定します。また、型宣言文で配列の形状を指定したり、初期値を与えることもできます。

    パラメータ
    説明

    以下のいずれかが入ります
    BYTE ©
    CHARACTER
    CHARACTER*n (n は 1 以上であること)
    CHARACTER*(*)
    COMPLEX
    COMPLEX*8 ©
    COMPLEX*16 ©
    COMPLEX*32 © (SPARC のみ)
    DOUBLE COMPLEX ©
    INTEGER
    INTEGER*2 ©
    INTEGER*4 ©
    INTEGER*8 ©
    LOGICAL
    LOGICAL*1 ©
    LOGICAL*2 ©
    LOGICAL*4 ©
    LOGICAL*8 ©
    REAL
    REAL*4 ©
    REAL*8 ©
    REAL*16 ©(SPARC のみ)
    DOUBLE PRECISION
    v
    変数名、配列名、配列宣言子、定数の英字名、文関数、関数の副プログラム名のどれか
    clist
    定数の並び (clist の詳細については、DATA 文の説明を参照してください)


    型 v [/ clist /] [,v [/ clist /]...

    型の前に AUTOMATIC 文または STATIC 文が入ることもあります。

    説明

    型宣言文を使用して以下のことが行えます。

    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 / 
    

    データ型を初期化する場合、以下の制限事項があります。

    上記の場合、コンパイラは警告メッセージを発し、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 NAME 
    
    	CHARACTER*10 TITLE/'Heading'/ 
    

    上記の例では、

    UNION と MAP

    UNION © 文は実行時にメモリーを共有する欄のグループを定義します。

    共用体宣言の構文は以下のとおりです。

    UNION
    
    	MAP 
    
    		      欄宣言
    
    		      欄宣言
    
    		      ... 
    ENDMAP
    	MAP	
    
    		      欄宣言
    
    	      	欄宣言
    
    	      	... 
    
    	END MAP
    
    
    
    END UNION 
    

    説明

    MAP 文は共用体内に代替の欄グループを定義します。実行時には 1 つのマップだけが共有の記憶場所と関連付けられます。マップ内の欄を引用すると、それまでのマップの欄グループは未定義になり、新しく引用された欄のマップ内の欄グループが記憶場所を引き継ぎます。

    UNION 行は本来複数行の文の集合の一部であり、UNION 行または END UNION 行のどちらも継続行はありません。6 桁目に空白以外の文字を入れたり、1 桁目に & を入れたりしないでください。

    MAP 宣言内の各欄宣言は以下のいずれかです。


    /STUDENT/ という構造体が NAME、CLASS、MAJOR または NAME、CLASS、CREDIT、GRAD_DATE のどちらかを含むように宣言しています。

    	STRUCTURE /STUDENT/ 
    
    	CHARACTER*32  NAME 
    
    	INTEGER*2  CLASS 
    
    	UNION 
    
    	MAP 
    
    	CHARACTER*16 MAJOR 
    
    	END MAP 
    
    	MAP 
    
    	INTEGER*2  CREDITS 
    
    	CHARACTER*8  GRAD_DATE 
    
    	END MAP 
    
    	END UNION 
    
    	END STRUCTURE 
    
    	RECORD /STUDENT/ PERSON 
    

    上記の例では、変数 PERSON は構造体 /STUDENT/ を持つため下記のことが言えます。

    VIRTUAL

    VIRTUAL © 文は DIMENSION 文と同じように扱われます。

    VIRTUAL a ( d ) [, a ( d ) ] ...

    パラメータ
    説明
    a
    配列名
    a(d)
    配列の次元。1 個から 7 個までの宣言子をコンマで区切って指定する。


    説明

    VIRTUAL 文は形式も働きも DIMENSION 文と同じです。VIRTUAL 文は Fortran 77 の旧バージョンとの互換性を保つためにあります。

    	VIRTUAL M(4,4), V(1000) 
    
    	... 
    
    	END 
    


    VOLATILE

    VOLATILE © 文は特定の項目に対して最適化が行われないようにします。

    パラメータ
    説明
    nlist
    変数、配列、共通ブロックの並び


    VOLATILE nlist

    説明

    VOLATILE 文は指定された並びの項目に対して最適化が行われないようにします。VOLATILE 文に動作が左右されるプログラムは、普通は移植できません。


    例 : VOLATILE ©

    	PROGRAM FFT 
    
    	INTEGER NODE*2, NSTEPS*2 
    
    	REAL DELTA, MAT(10,10), V(1000), X, Z 
    
    	COMMON /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 ]

    [, ERR=s ] ) iolist

    WRITE( [ UNIT= ] u, [ NML= ] grname [, IOSTAT= ios ] [, ERR= s ] )

    パラメータ
    説明
    u
    ファイルに結合された装置の装置識別子
    f
    書式識別子
    ios
    入出力状態識別子
    rn
    記録番号
    s
    誤り指定子 (文番号)
    iolist
    変数の並び
    grname
    変数群の名前


    オプションはどのような順番で指定してもかまいません。

    REC=rn という形式の代わりに次のように書くこともできます。©

     WRITE( u ' rn ... ) iolist © 
    

    「例」の例 3 は、この形式の例も兼ねています。

    説明

    テープ上のファイルに対しては、TOPEN() ルーチンを使用する方が確実です。

    装置識別子

    u は外部装置識別子または内部ファイル識別子です。

    外部装置識別子は次のどちらかです。

    装置指定子から 省略可能な UNIT= を省略する場合、指定子の並びの中では u を最初の項目に指定しなければなりません。

    書式識別子

    f は書式識別子で、次のものがあります。

    実行時に評価される書式の詳細については、「実行時書式」を参照してください。

    書式識別子から省略可能な FMT= を省略する場合、f は書式付き WRITE 文の 2 番目の引数に指定しなければなりません。他の場合に f を指定することはできません。

    f は直接探査のときは、アスタリスクにすることはできません。

    f は内部ファイルのとき、アスタリスクにすることができます。©

    ファイルが書式付き入出力に結合されている場合、書式なしのデータは転送できません。逆に、ファイルが書式なし入出力に結合されている場合は、書式付きのデータは転送できません。

    入出力状態指定子

    ios は整変数、整数配列要素、整数の記録欄のいずれかでなければなりません。

    記録番号

    rn は正の整数式でなければなりません。この引数は直接探査ファイルにだけ使用できます。rn は内部ファイルに対しても指定できます。©

    エラー指定子

    sWRITE 文があるプログラム単位内の実行文の文番号でなければなりません。

    出力並び

    iolist には、何も指定しないことも、出力並びの項目と DO 型並びのどちらかまたは両方を指定することもできます。出力並びの項目には以下のものがあります。

    添字が指定されていない単純な配列名は、配列のすべての要素をメモリーに格納されている順に指定します。このとき添字は左の方が他より速く増加します。

    DO 型並びの詳細については、「DO 型並び」を参照してください。

    出力並び項目が連結演算子を使用した文字式である場合、そのオペランドの長さ指定子にアスタリスク (*) を指定することもできます。これは規格外です。©

    出力並びにある関数は、入出力文を実行するものであってはなりません。

    変数群を指定した WRITE

    WRITE 文のもう 1 つの形式は、指定された変数群の項目を出力するために使用されます。この grnameNAMELIST 文で、すでに定義された変数群の名前です。

    実行

    この形式は以下の手順で実行されます。

    1. 指定された装置に結合するファイルを決めます。

    書式が指定されている場合はその書式が設定されます。ファイルはデータ転送前に適切な場所に位置付けられます。

    2. 出力並びが空でない場合、データは出力並びからファイルに転送されます。

    書式が指定されている場合は書式に合わせてデータが編集されます。

    3. 変数群が指定された WRITE の 2 つ目の構文では、データは変数群出力に関する規則に従って指定された変数群の項目から転送されます。

    4. ファイルはデータ転送後、再び適切な場所に位置付けられます。

    5. ios が指定されている場合、エラーが生じなければ ios はゼロに設定されます。エラーが生じれば、ios は正の値に設定されます。

    6. s が指定されている場合にエラーが生じると制御は s に渡されます。

    制限事項

    次の制限事項があります。

    ユーザー自身の例外ハンドラを作成する場合、そのハンドラから Fortran 77 出力を行わないでください。どうしても必要な場合は、出力直後に ABORT を呼び出します。こうすることによって、システムが凍結する危険を減らすことができます。例外ハンドラからの Fortran 77 入出力は再帰的な入出力です。次の段落を参照してください。
    入出力リスト中に関数をリストして、その関数が入出力を行う場合、実行時に実行が凍結するか、その他にも予測できない問題が発生する可能性があります。この危険は並列化に関わらず存在します。

    例 : 再帰的な入出力は時として失敗する。

    	PRINT *, x, f(x)      f() が入出力を行なうため、使用できない。
    
    	END
    
    	FUNCTION F(X)
    
    	WRITE(*,*) X
    
    	RETURN
    
    	END
    

    注釈

    u がファイルに結合されていない外部装置を指定する場合、ファイルを開くための OPEN 操作が暗黙的に実行されます。この操作は以下のようにオプションを指定してファイルを開くのと同等です。

    	OPEN( u, FILE ='FORT.u', STATUS ='UNKNOWN', 
    
    	& ACCESS='SEQUENTIAL', FORM= fmt ) 
    

    fmt の値は書式付きの場合は 'FORMATTED' で、指定なしの場合は 'UNFORMATTED' です。

    添字が指定されていない単純な配列名は、配列のすべての要素をメモリーに格納されている順に指定します。このとき添字は左の方が他より速く増加します。

    直接探査ファイルの記録番号は 1 から始まります。

    変数群出力は、順番探査ファイルでのみ行うことができます。


    例 1 : 書式付き WRITE、入出力エラートラップと入出力状態あり

    	WRITE( 1, 2, ERR=8, IOSTAT=N ) X, Y 
    
    	RETURN 
    
    	... 
    
    8	WRITE( *, * ) '1 における入出力エラー番号: ', N
    
    	STOP 
    
    	END 
    


    例 2 : 直接、書式なし WRITE、入出力エラートラップと入出力状態あり

    	... 
    
    	WRITE( 1, REC=3, IOSTAT=N, ERR=8 ) V 
    
    	... 
    
    4	CONTINUE 
    
    	RETURN 
    
    8 	WRITE( *, * ) '1 における入出力エラー番号: ', N
    
    	END 
    


    例 3 : 直接、代替構文 (上記の例と同等) ©

    	... 
    
    	WRITE( 1 ' 3, IOSTAT=N, ERR=8 ) V ©
    
    	... 
    
    4	CONTINUE 
    
    	RETURN 
    
    8 	WRITE( *, * ) '1 における入出力エラー番号: ', N 
    
    	END 
    


    例 4 : 画面への並びによる WRITE

    	WRITE( *, * ) A, V 
    
    または 
    
    	PRINT *, A, V 
    


    例 5 : 内部ファイルへの書式付き WRITE

    	CHARACTER CA*16, L*8 /'abcdefgh'/, R*8 /'ijklmnop'/ 
    
    	WRITE( CA, 1 ) L, R 
    
    1	FORMAT( 2 A8 ) 
    


    例 6 : 配列全体の書き込み

    	DIMENSION V(5) 
    
    	WRITE( 3, '(5F4.1)') V
    


    例 7 : 変数群出力を指定した WRITE

    	CHARACTER SAMPLE*16 
    
    	LOGICAL NEW*4 
    
    	REAL DELTA*4 
    
    	NAMELIST /G/ SAMPLE, NEW, DELTA 
    
    	... 
    
    	WRITE( 1, G ) 
    
    または 
    
    	WRITE( UNIT=1, NML=G ) 
    
    または
    
    	WRITE( 1, NML=G )
    



    サン・マイクロシステムズ株式会社
    Copyright information. All rights reserved.
    ホーム   |   目次   |   前ページへ   |   次ページへ   |   索引