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が先なんでしょうね。
コメント