FORTRAN(echoコマンドを作るその3)

旧2-5. Fortran毎日学習

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:~$

とてもうまくいきました。

コメント

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