FORTRAN(seqコマンドを作る)

旧2-5. Fortran毎日学習
TVアニメ『戦刻ナイトブラッド』プロモーションビデオ 第2弾

アニメ『戦刻ナイトブラッド』(2017)

戦国ものは好きなので、このアニメも例外ではありません。なぜか織田信長と豊臣秀吉が戦っているのですが、全然気にしません。キャラが戦国武将の名前だと新たに覚える必要がないのでそこが見ていて楽なところです。ゲームの方も気になるので一度やってみようと思います。

ではFORTRANです。
そろそろFORTRAN77のことが分かってきたつもりなので、プログラミングしてみます。いつものごとく大好きなseqコマンドを作っていきます。まずはコマンド引数を取得するFORTRAN77プログラムです。

takk@deb9:~$ cat arg.f
      PROGRAM GETARGUMENTS
      CHARACTER*20 ARG0,ARG1,ARG2,ARG3
      CALL GETARG(0,ARG0)
      CALL GETARG(1,ARG1)
      CALL GETARG(2,ARG2)
      CALL GETARG(3,ARG3)
      WRITE(*,10) ARG0
      WRITE(*,10) ARG1
      WRITE(*,10) ARG2
      WRITE(*,10) ARG3
   10 FORMAT(A)
      STOP
      END
takk@deb9:~$

実行すると、

takk@deb9:~$ gfortran arg.f
takk@deb9:~$ ./a.out a b c
./a.out
a
b
c
takk@deb9:~$ 

ARG0にコマンドそのものの文字列が格納されます。C言語と同じです。ARG1~にパラメータが格納されます。例ではARG3までですが、パラメータ数が取得できるので、DOで回して処理すればよいです。
コマンドの引数の取得方法が分かりましたので、seqコマンドを作っていきます。まずは引数一つの場合のプログラムを作る前に、seq 10の固定結果が返るプログラムを作ってみます。

takk@deb9:~/gf$ cat seq.f
      PROGRAM seq
      DO 11111 I = 1, 10
11111   WRITE(*,22222) I
      CONTINUE
22222 FORMAT(I3)
      STOP
      END
takk@deb9:~$ gfortran seq.f
takk@deb9:~$ ./a.out
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
takk@deb9:~$

うまくいきました。DO行の10をコマンド引数の数字の変数にすり替えれば、作れそうです。はい。そうして作ったプログラムがこれです。

takk@deb9:~$ cat seq.f
      PROGRAM seq
      CHARACTER*10 ARG1
      CALL GETARG(1,ARG1)
      READ(ARG1,*) K
      DO 11111 I = 1, K
11111   WRITE(*,22222) I
      CONTINUE
22222 FORMAT(I3)
      STOP
      END
takk@deb9:~$

実行結果です。

takk@deb9:~$ gfortran seq.f
takk@deb9:~$ ./a.out 3
  1
  2
  3
takk@deb9:~$ ./a.out 5
  1
  2
  3
  4
  5
takk@deb9:~$ ./a.out 10
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
takk@deb9:~$

コメント

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