fortran66のブログ

fortran について書きます。

定義の先取り

Fortran では、意外にも定義の先取りができることがままあって、知らないと損します。再帰的な構造体の定義などが典型的なものですが、その他にも微妙なところで気が利いていたりします。

1.配列宣言の初期化での形状サイズの利用。
    program test1
      implicit none
      integer :: i, n
      real :: a(3, 2) = reshape([(real(i), i = 1, 6)], shape(a))   ! <-- shape(a)
      real :: b(6)
      print '(2g10.2)', transpose(a)
    end program test1

実数配列を宣言しますが、その初期化時に右辺で定義する配列の形状・サイズ等 a の属性を利用できます。

実行結果

   1.0       4.0
   2.0       5.0
   3.0       6.0
続行するには何かキーを押してください . . .
2.ファイル入力でのサイズ読み込み (FORTRAN66 時代から可)

    program test2
      implicit none
      integer :: i, n
      real :: a(3, 2) = reshape([(real(i), i = 1, 6)], shape(a))
      real :: b(6)
      !
      write(9) size(a), a
      close(9)
      read(9) n, (b(i), i = 1, n)        ! <-- n 
      print *, b
    end program test2

ファイルからデータを読み込むときに、読み取ったデータが同一行での implied do loop の中で利用できます。これは、実行時の変数の値の確定順序によるもので、ちょっと見には値不定のような気がしますが、Fortran では規格で許されている利用法です。

実行結果

   1.000000       2.000000       3.000000       4.000000       5.000000
   6.000000
続行するには何かキーを押してください . . .


他にも色々あると思いますが、すぐには出てこない・・・