FORTRAN(tacコマンドを作る)

今回はFORTRANでtacコマンドを作ります。まずtacの動きを確認します。

takk@deb9:~$ cat x00
10
20
30
40
50
60
70
80
90
100
takk@deb9:~$ tac x00
100
90
80
70
60
50
40
30
20
10
takk@deb9:~$

上下逆にするだけですね。簡単ですね。いまどきのスクリプトならこんな感じで3行で書ける処理です。

takk@deb9:~$ cat tac.pl
@lines = <>;
@reverse_lines = reverse @lines;
print"@reverse_lines";
takk@deb9:~$
takk@deb9:~$ perl tac.pl x00
100
 90
 80
 70
 60
 50
 40
 30
 20
 10
takk@deb9:~$

FORTRAN77だとそう簡単にいかなさそうです。まあ学び始めたばかりなので。

まずは文字列を配列に格納する処理を作ります。

takk@deb9:~$ cat tac1.f
      PROGRAM cat
      CHARACTER*50 ARGS,LINE,LINES(100)
      INTEGER N,NUM
      NFLAG=0
      N = IARGC()
      NUM=1
      DO 11111 I=1,N
        CALL GETARG(I,ARGS)
        OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
     1  STATUS='OLD',
     2  ACCESS='SEQUENTIAL')
   10   READ(10,*,END=100) LINE
        LINES(NUM) = LINE
        NUM=NUM+1
        GOTO 10
  100   CLOSE(10,STATUS='KEEP')
11111 CONTINUE
      STOP
      END

takk@deb9:~$

実行はしてみますが、何の表示もしていないので、エラーが起きなかったことが分かるだけです。

takk@deb9:~$ gfortran tac1.f
takk@deb9:~$ ./a.out x00
takk@deb9:~$

次は格納した配列の内容を表示するプログラムに改造します。

takk@deb9:~$ cat tac2.f
      PROGRAM cat
      CHARACTER*50 ARGS,LINE,LINES(100)
      INTEGER N,NUM
      NFLAG=0
      N = IARGC()
      NUM=1
      DO 11111 I=1,N
        CALL GETARG(I,ARGS)
        OPEN(UNIT=10,FILE=ARGS(1:INDEX(ARGS,' ')-1),
     1  STATUS='OLD',
     2  ACCESS='SEQUENTIAL')
   10   READ(10,*,END=100) LINE
        LINES(NUM) = LINE
        NUM=NUM+1
        GOTO 10
  100   CLOSE(10,STATUS='KEEP')
11111 CONTINUE
      DO 22222 I=1,NUM-1
        WRITE(*,33333) LINES(I)
22222 CONTINUE

33333 FORMAT(A)
      STOP
      END

takk@deb9:~$

結果です。

takk@deb9:~$ gfortran tac2.f
takk@deb9:~$ ./a.out x00
10
20
30
40
50
60
70
80
90
100
takk@deb9:~$

最後に表示する配列の要素が逆になるような添え字への計算を加えます。

      DO 22222 I=1,NUM-1
        WRITE(*,33333) LINES(NUM-I)
22222 CONTINUE

このように修正しました。
結果です。

takk@deb9:~$ gfortran tac3.f
takk@deb9:~$ ./a.out x00
100
90
80
70
60
50
40
30
20
10
takk@deb9:~$

Leave a Reply

Your email address will not be published. Required fields are marked *

CAPTCHA