fortran66のブログ

fortran について書きます。

C 言語の sizeof 関数の代わりになりうる Fortran の inquire 命令

C 言語の sizeof 関数のように、構造体などのデータ長を返す関数は Fortran にはないと思っていたのですが、なんと INQUIRE 文で得ることが出来るようです。ただし、単位がファイルのレコード長の単位なので、バイト長が欲しいならばレコード長の単位をコンパイラのオプションなどバイトに直しておく必要があります。

    program inq
      implicit none
      type :: t_test
        sequence
        integer(2) :: i
        character :: ch
      end type t_test
      type (t_test) :: t
      integer :: m

      inquire (iolength = m) t
      print *, m
    end program inq

Intel Fortran の場合レコード長の単位は、デフォルトで語すなわち 4byte なので、デフォルトで実行すると値は1、コンパイラ・オプションでレコード長単位をバイトにすると3が返ってきます。

gfortran の場合は、デフォルトのレコード長の単位はバイトのようです。大型機などでは語になっているのが多い記憶があります。

FORTRAN77 では INQUIRE 文は、ファイル名またはユニット名を引数に取る外部ファイルの情報をとる命令でしたが、Fortran90 からは、あらたに変数・構造体の長さを返す機能が付け加えられていたようです。Reid & Metcalf の Fortran8x Explained からずーっと載っていたのに、気づきいていませんでした。

組み込み関数リストを探しても無いわけです。ファイル関係の INQUIRE 命令の、しかも返り値が括弧の中で、入力が命令の外にある破格の形式になっていて、inquire 文の説明の最後に項目立てもされずにちょこっと触れられているだけで、全く視野に入っていませんでした。不覚w

2017-05-09 追記
Fortran2008 命令には storage_size 関数があって、これはそのものずばりメモリー上の変数のビットサイズを返します。inquire はファイルで変数群を一気に読み書きするときのレコード長を知るためにあるものと思われます。