FORTRAN(seqコマンドを作る3)

旧2-5. Fortran毎日学習

FORTRANでseqコマンドの続きです。
今まで学習したことを組み合わせてパラメータを3つまで対応するseqコマンドを作ります。
まずは何も考えずに5パターンのプログラムを作ります。

takk@deb9:~$ cat seq.f
      PROGRAM seq
      INTEGER FIRST,STEP,LAST
      CHARACTER*10 ARG1,ARG2,ARG3

      FIRST = 1
      STEP = 1

      I = IARGC()

      IF(I.EQ.0) THEN
        WRITE(*,99999)
      END IF

      IF(I.EQ.1) THEN
        CALL GETARG(1,ARG3)
        READ(ARG3,*) LAST
      END IF

      IF(I.EQ.2) THEN
        CALL GETARG(1,ARG1)
        CALL GETARG(2,ARG3)
        READ(ARG1,*) FIRST
        READ(ARG3,*) LAST
      END IF

      IF(I.EQ.3) THEN
        CALL GETARG(1,ARG1)
        CALL GETARG(2,ARG2)
        CALL GETARG(3,ARG3)
        READ(ARG1,*) FIRST
        READ(ARG2,*) STEP
        READ(ARG3,*) LAST
      END IF

      IF(I.GT.3) THEN
        WRITE(*,99999)
      END IF
      CALL GETARG(1,ARG1)
      READ(ARG1,*) K

      DO 11111 I = FIRST, LAST, STEP
11111   WRITE(*,10000) I
      CONTINUE

10000 FORMAT(I5)
99999 FORMAT('ERROR')
      STOP
      END
takk@deb9:~$
takk@deb9:~$ gfortran seq.f
takk@deb9:~$ ./a.out 10
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
takk@deb9:~$ ./a.out 1 5
    1
    2
    3
    4
    5
takk@deb9:~$ ./a.out 2 5
    2
    3
    4
    5
takk@deb9:~$ ./a.out 1 2 10
    1
    3
    5
    7
    9
takk@deb9:~$ 

引数があるときは動きましたが、引数なしだとエラーになります。

takk@deb9:~$ ./a.out
ERROR
At line 39 of file seq.f
Fortran runtime error: End of file

Error termination. Backtrace:
#0  0x7fa01deb6d4a
#1  0x7fa01deb7825
#2  0x7fa01deb7f79
#3  0x7fa01df7adc3
#4  0x7fa01df75c51
#5  0x564e009d2029
#6  0x564e009d2162
#7  0x7fa01d3c22b0
#8  0x564e009d19a9
#9  0xffffffffffffffff
takk@deb9:~$

引数チェックをするように変更します。パラメータが1~3の範囲内である場合のみ処理することにします。

takk@deb9:~$ cat seq.f
      PROGRAM seq
      INTEGER FIRST,STEP,LAST
      CHARACTER*10 ARG1,ARG2,ARG3

      FIRST = 1
      STEP = 1

      I = IARGC()

      IF((I.LT.1).OR.(I.GT.3)) THEN
          WRITE(*,99999)
          GOTO 99998
      ELSE IF(I.EQ.1) THEN
          CALL GETARG(1,ARG3)
          READ(ARG3,*) LAST
      ELSE IF(I.EQ.2) THEN
          CALL GETARG(1,ARG1)
          CALL GETARG(2,ARG3)
          READ(ARG1,*) FIRST
          READ(ARG3,*) LAST
      ELSE IF(I.EQ.3) THEN
          CALL GETARG(1,ARG1)
          CALL GETARG(2,ARG2)
          CALL GETARG(3,ARG3)
          READ(ARG1,*) FIRST
          READ(ARG2,*) STEP
          READ(ARG3,*) LAST
      END IF

      DO 11111 I = FIRST, LAST, STEP
11111     WRITE(*,10000) I
      CONTINUE

10000 FORMAT(I5)
99999 FORMAT('ERROR')
99998 STOP
      END
takk@deb9:~$ gfortran seq.f
takk@deb9:~$ ./a.out
ERROR
takk@deb9:~$ ./a.out 1 5 10 20
ERROR
takk@deb9:~$ ./a.out 0 2 10
    0
    2
    4
    6
    8
   10
takk@deb9:~$ ./a.out 3 5
    3
    4
    5
takk@deb9:~$ ./a.out 4
    1
    2
    3
    4
takk@deb9:~$

一応動いたようです。

コメント

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