今まで繰り返し制御に使っていた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を使っていきます。
コメント