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:~$
とてもうまくいきました。


コメント