データ転送文において DO 形反復は,DO ループ中の I/O 文の一部であるかのように機能します。これは次の形式を取ります。
(list, do-var = expr1, expr2 [,expr3])
list
変数,式,または定数の並び (「I/O 並び中の単純並び項目」を参照してください)。
do-var
スカラ整数または実数変数の名前。変数は,list 中の入力項目または出力項目の 1 つであってはなりません。
expr
整数型または実数型のスカラ数値式。これらは,すべてが同じ型であったり,DO 変数と同じ型である必要はありません。
DO 形反復は,DO 構文と同じように開始され,実行され,終了します。
list は DO 形反復の範囲です。その並び中の項目は,do-var を引用することができますが,do-var 値を変更してはなりません。
2 つの入れ子にされた DO 形反復が,同じ (または結合された) DO 変数を持つことはできません。
DO 形反復は以下の用途に使用することができます。
I/O 並びの一部を繰り返し指定する
配列の一部を転送する
配列項目を添字の順序とは異なる順序で転送する
DO 形反復を含んでいる I/O 文が (END,EOR,ERR 飛越しによって,またはゼロ以外の IOSTAT 値で) 異常終了した場合,DO 変数は不定となります。
例
以下の 2 つの出力文は等価です。
WRITE (3,200) (A,B,C, I=1,3) ! DO 形反復 WRITE (3,200) A,B,C,A,B,C,A,B,C ! 単純並び項目
次の例は,入れ子にされた DO 形反復を示しています。一番内側の並びの実行が最も多く繰り返されます。
WRITE (6,150) ((FORM(K,L), L=1,10), K=1,10,2)
内側の DO ループは,外側ループを繰り返すたびに 10 回実行されます。第 2 添字 (L) は,第 1 添字 (K) が 1 だけ増えるたびに,1 から 10 まで増えます。これは通常の配列要素順序とは逆の順序です。K は 2 ずつ増えるので,配列の奇数番号の行だけが出力されることに注意してください。
次の例では,I が 2 に増える前に,DO 形反復の並び全体 (P(1),Q(1,1),Q(1,2)...,Q(1,10)) が読み取られます。
READ (5,999) (P(I), (Q(I,J), J=1,10), I=1,5)
次の例は,固定添字と DO 形反復に従って変化する添字を使用しています。
READ (3,5555) (BOX(1,J), J=1,10)
入力値は BOX(1,1) から BOX(1,10) までに代入されますが,配列の他の要素は影響を受けません。
次の例は,DO 変数を直接出力する方法を示しています。
WRITE (6,1111) (I, I=1,20)
整数 1 ~ 20 が書き込まれます。
以下に他の例を示します。
INTEGER mydata(25) READ (10, 9000) (mydata(I), I=6,10,1) 9000 FORMAT (5I3)
この例では,I/O 並びは mydata と呼ばれる配列の 6 ~ 10 の要素に入力データを置くように指定しています。DO 形反復の第 3 の値,ループの増分値は,省略可能です。省略すると,ループの増分値として基本値 1 が使われます。
関連情報