今まで繰り返し制御に使っていたDO文は、こんな形でした。
takk@deb9:~$ cat do.f
PROGRAM MAIN
DO 1000 I=1,10
WRITE(*,*) 'HELLO'
1000 CONTINUE
STOP
END
takk@deb9:~$ gfortran do.f
takk@deb9:~$ ./a.out
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
takk@deb9:~$
手元の古い教科書がCONTINUEを使う構文でしたので気にしてませんでしたが、どうやら古い書き方のようで、繰り返しは、END DOを使うのが正解のようです。
takk@deb9:~$ cat do.f90
PROGRAM MAIN
DO I=1,10
WRITE(*,*) 'HELLO'
END DO
STOP
END
takk@deb9:~$ gfortran do.f90
takk@deb9:~$ ./a.out
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
takk@deb9:~$
END DOでも行番号を指定して、入れ子のDOに対して一つのEND DOにできるのでしょうか。
入れ子にする前に、行番号が使えるかどうかやってみます。
takk@deb9:~$ cat do.f90
PROGRAM MAIN
DO 10000 I=1,10
WRITE(*,*) 'HELLO'
10000 END DO
STOP
END
takk@deb9:~$ gfortran do.f90
takk@deb9:~$ ./a.out
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
takk@deb9:~$
使えるようです。
次に入れ子にします。ただし、DO 2つに対して、END DOは1つです。
takk@deb9:~$ cat do.f90
PROGRAM MAIN
DO 10000 I=1,2
DO 10000 J=1,3
WRITE(*,*) 'HELLO'
10000 END DO
STOP
END
takk@deb9:~$ gfortran do.f90
takk@deb9:~$ ./a.out
HELLO
HELLO
HELLO
HELLO
HELLO
HELLO
takk@deb9:~$
許容されてるんですね。
では、行番号を外すとどうなるのでしょう。
takk@deb9:~$ cat do.f90
PROGRAM MAIN
DO I=1,2
DO J=1,3
WRITE(*,*) 'HELLO'
END DO
STOP
END
takk@deb9:~$ gfortran do.f90
do.f90:7:9:
END
1
Error: END DO statement expected at (1)
f951: Error: Unexpected end of file in ‘do.f90’
takk@deb9:~$
ビルドエラーになりました。
使い方は分かりました。CONTINUEを使う書き方は古いらしいので、これからはEND DOを使っていきます。


コメント