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