FORTRAN(書式付き表示その3)


アニメ『このはな綺譚』

狐女子の仲居さんのお話です。癒されます。嗚呼温泉旅館泊まりたい。

FORTRAN、書式付き表示の続きです。改行の仕方がわかりました。たぶん。

前回使ったように、クォートで囲った文字列をカンマをつけて引数に指定すると、文字列が連続で表示されますね。

takk@deb9:~$ cat disp.f
       WRITE(*,11111)
11111  FORMAT('AAA','BBB','CCC')
       STOP
       END
takk@deb9:~$ gfortran disp.f
takk@deb9:~$ ./a.out
AAABBBCCC
takk@deb9:~$

改行にするには、カンマをスラッシュにすれば良いようです。
これは到底思いつかないです。古い教科書が頼りでした。

takk@deb9:~$ cat disp.f
       WRITE(*,11111)
11111  FORMAT('AAA'/'BBB'/'CCC')
       STOP
       END
takk@deb9:~$ gfortran disp.f
takk@deb9:~$ ./a.out
AAA
BBB
CCC
takk@deb9:~$

次は数値の書式です。FORTRANのFORMATの数値の記述子には以下があります。

整数の書式 I
実数の書式 F E G

使っていきます。整数型の記述子Iから。このような簡単なプログラムで確認します。

takk@deb9:~$ cat disp.f
       A=200
       WRITE(*,11111) A
11111  FORMAT(I5)
       STOP
       END
takk@deb9:~$

ビルドして実行してみましょう。

takk@deb9:~$ gfortran disp.f
takk@deb9:~$ ./a.out
At line 2 of file disp.f (unit = 6, file = 'stdout')
Fortran runtime error: Expected INTEGER for item 1 in formatted transfer, got REAL
(I5)
 ^

Error termination. Backtrace:
#0  0x7f2113e68d4a
#1  0x7f2113e69825
#2  0x7f2113e69f79
#3  0x7f2113f21378
#4  0x7f2113f2c636
#5  0x7f2113f2e812
#6  0x55ccfcb52985
#7  0x55ccfcb529d9
#8  0x7f21133742b0
#9  0x55ccfcb527f9
#10  0xffffffffffffffff
takk@deb9:~$

なぜエラー・・・?

エラーメッセージにREALとあるので実数型になってるのでしょうか。

無理やり整数型にしてみましょうか。感です。

WRITE文で指定している変数AにINT関数を適応してみました。

takk@deb9:~$ cat disp.f
       A=200
       WRITE(*,11111) INT(A)
11111  FORMAT(I5)
       STOP
       END
takk@deb9:~$ gfortran disp.f
takk@deb9:~$ ./a.out
  200
takk@deb9:~$

ビルドが通ってびっくり。結果も合ってます。

INT関数で整数型になったということは、A=200は実数なんでしょうね。
整数の宣言が必要なのでしょうか。

整数の変数宣言はINTEGERを使うようです。
宣言してから使ってみます。

takk@deb9:~$ cat disp.f
       INTEGER A
       A=200
       WRITE(*,11111) A
11111  FORMAT(I5)
       STOP
       END
takk@deb9:~$ gfortran disp.f
takk@deb9:~$ ./a.out
  200
takk@deb9:~$

今度はエラー出ませんでした。
最近のスクリプトのように、変数の型宣言なしで使うのは危ないってことでしょうね。
FORTRANのことが毎日少しずつ分かってきてる気がします。

Leave a Reply

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

CAPTCHA