Fortran、次は、do構文のexitを使ってみます。
まずはexitなしの繰り返し文です。
takk@deb9:~$ cat do-only.f90
PROGRAM MAIN
DO I=1,2
DO J=1,3
WRITE(*,*) I,J
END DO
END DO
STOP
END
takk@deb9:~$ gfortran do-only.f90
takk@deb9:~$ ./a.out
1 1
1 2
1 3
2 1
2 2
2 3
takk@deb9:~$
EXITを追加します。
Jが2になったらEXITする。
takk@deb9:~$ cat do-exit.f90
PROGRAM MAIN
DO I=1,2
DO J=1,3
IF(J.EQ.2)EXIT
WRITE(*,*) I,J
END DO
END DO
STOP
END
takk@deb9:~$ gfortran do-exit.f90
takk@deb9:~$ ./a.out
1 1
2 1
takk@deb9:~$
1列目のIが2回回りましたので、内部のDOだけEXITしたことがわかります。
外部のDOを指定することもできるようです。
takk@deb9:~$ cat do-exit2.f90
PROGRAM MAIN
OUTER: DO I=1,2
DO J=1,3
IF(J.EQ.2)EXIT OUTER
WRITE(*,*) I,J
END DO
END DO
STOP
END
takk@deb9:~$
EXITにOUTERとうラベルを指定して、外部のDOを指定するようにしました。
ビルドしてみます。
takk@deb9:~$ gfortran do-exit2.f90
do-exit2.f90:7:14:
END DO
1
Error: Expected block name of ‘outer’ in END DO statement at (1)
do-exit2.f90:9:9:
END
1
Error: END DO statement expected at (1)
f951: Error: Unexpected end of file in ‘do-exit2.f90’
takk@deb9:~$
エラーになりました。DOにラベルを付けたら、対応するEND DOにも書かないといけないみたいです。
takk@deb9:~$ cat do-exit2.f90
PROGRAM MAIN
OUTER: DO I=1,2
DO J=1,3
IF(J.EQ.2)EXIT OUTER
WRITE(*,*) I,J
END DO
END DO OUTER
STOP
END
takk@deb9:~$ gfortran do-exit2.f90
takk@deb9:~$
外側のEND DOをEND DO OUTERにしたら、ビルド通りました。
実行してみます。
takk@deb9:~$ ./a.out
1 1
takk@deb9:~$
外側のDOが指定されたので、一回だけ回って終了しました。
EXITという名前は、他の言語だとプログラム終了だったりするので、紛らわしいかもしれませんが、いろんな言語の兄であるFORTRANが先なんでしょうね。


コメント