FORTRANでechoコマンドの続きです。
前回-nオプションに対応しましたが動きはいまいちでした。
本物のechoコマンド方はどんな動きをするのでしょう。
takk@deb9:~$ echo HELLO -n HELLO -n takk@deb9:~$ echo -n HELLO HELLOtakk@deb9:~$
どうやら、オプションは先頭のパラメータでないといけないようですね。
先頭のパラメータだけオプションとしてみなすように修正するのは簡単ですね。
IF((ARGS.EQ.'-n') .AND. (I.EQ.1)) THEN
このようにオプションの判定を最初のパラメータの場合のみに修正しました。
そしてできあがったプログラムがこれです。
takk@deb9:~$ cat echo6.f PROGRAM echo CHARACTER*100 ARGS INTEGER N,NFLAG NFLAG=0 N = IARGC() DO 11111 I=1,N CALL GETARG(I,ARGS) IF((ARGS.EQ.'-n') .AND. (I.EQ.1)) THEN NFLAG = 1 END IF IF((I.EQ.N) .AND. (NFLAG.EQ.0) ) THEN WRITE(*,33333) ARGS(1:INDEX(ARGS,' ')-1) ELSE WRITE(*,22222) ARGS(1:INDEX(ARGS,' ')) END IF 11111 CONTINUE 22222 FORMAT(A$) 33333 FORMAT(A) STOP END takk@deb9:~$
実行してみます。
takk@deb9:~$ gfortran echo6.f -fdollar-ok takk@deb9:~$ ./a.out -n aaa bbb ccc -n aaa bbb ccc takk@deb9:~$
忘れてました。先頭パラメータがオプションの場合は、表示する文字列から除外しなければなりません。
オプションを見つけたらIに1プラスしてみます。
IF((ARGS.EQ.'-n') .AND. (I.EQ.1)) THEN NFLAG = 1 I = I + 1 END IF
takk@deb9:~$ gfortran echo7.f -fdollar-ok echo7.f:10:72: echo7.f:6:72: DO 11111 I=1,N 2 echo7.f:10:72: I = I + 1 1 Error: Variable ‘i’ at (1) cannot be redefined inside loop beginning at (2) takk@deb9:~$
DOで回すループ変数の値を途中で変更するのはまずいようです。ビルドエラーになります。
そもそももっと簡単な方法がありました。ELSE IFを使えばよいです。
takk@deb9:~$ cat echo8.f PROGRAM echo CHARACTER*100 ARGS INTEGER N,NFLAG NFLAG=0 N = IARGC() DO 11111 I=1,N CALL GETARG(I,ARGS) IF((ARGS.EQ.'-n') .AND. (I.EQ.1)) THEN NFLAG = 1 ELSE IF((I.EQ.N) .AND. (NFLAG.EQ.0) ) THEN WRITE(*,33333) ARGS(1:INDEX(ARGS,' ')-1) ELSE WRITE(*,22222) ARGS(1:INDEX(ARGS,' ')) END IF 11111 CONTINUE 22222 FORMAT(A$) 33333 FORMAT(A) STOP END takk@deb9:~$
実行します。
takk@deb9:~$ ./a.out -n aaa bbb ccc aaa bbb ccc takk@deb9:~$ takk@deb9:~$ ./a.out aaa bbb ccc -n aaa bbb ccc -n takk@deb9:~$ ./a.out aaa bbb ccc aaa bbb ccc takk@deb9:~$ ./a.out -n takk@deb9:~$
とてもうまくいきました。
コメント