💯
Fortranの装置番号の上限を調べてみた
TL;DR
- 最近のコンパイラであれば通常の32bit integer型の上限(2**31-1)まで設定できる。
- さすがに64bit拡張した整数を入れるとIOエラーになる
Fortranの装置番号について
Fortranでは入出力のために開いたファイルを装置番号という一意な整数値で管理します。
open(77,file="sample.txt")
write(77,*) "This is test"
close(77)
かつてのFortranではこの装置番号には上限がありました。
マシンによって異なるようで、0から99、1から99、0から2,147,483,647など、様々である。
そこで、自分の環境で上限がいくらなのかを調べてみました。
テストコード
program main
implicit none
integer(kind=16) :: UNIT_NUMBER = 64 !ここを変えて探索してみる
open(UNIT_NUMBER,file="test.text")
write(UNIT_NUMBER,*) "test",UNIT_NUMBER
close(UNIT_NUMBER)
end program main
コンパイラはCrayのFortran 9.0.2とgfortran 9.4.0を使いました。
結果
まとめると下記のようになります。
- ともにUNIT_NUMBER=2**30 -1 +2**30(integer型の上限)まで開くことができました。
- kindを指定しないinteger型で2**31を計算させるとオーバーフローしてエラーになります。
- kind=16として64bit整数としても、2**31を入れるとopen文がエラーになります。
2**31-1 = 2,147,483,647まであるので、最近のFortranであればあまり上限は気にせず任意の整数を使ってよいという理解でよいでしょう。
また少し主題から外れますが、最近はopen文でnewunitオプションを使うことで動的に割り当てることができたり、inquire文という機能があったり、いちいち装置番号をユーザーが指定しなくてもよいようです。
Discussion