Fortran90(do~exit)

旧2-5. Fortran毎日学習

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

コメント

タイトルとURLをコピーしました