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:~$
一応動いたようです。



コメント