fortran66のブログ

fortran について書きます。

リスト構造のようなもの

配列の配列が欲しくなる時があるのですが、実行時にしかサイズの決まらない場合 Fortran では面倒になります。ポインタを使ってリスト構造を定義してもいいのですが、Fortran の世界ではポインタを使ったら負けに近いので、動的確保や後処理とかをちゃんとやってくれる allocatable な属性を出来るだけ使いたいところです。

しかし、Fortran2003 の範囲ではポインタを使わないと deep copy が発生してしまって、これもまた負けの気がしますが、小さい配列の場合には気にしないことにします。

Fortran では規格が進むごとに、ポインタでしかできなかったことが allocatable 属性で処理できるように進化してきています。f2008 でもリスト構造用のポインタの置き換えができるようになっていますが(いわゆる NEXT を指示するポインタが allocatable 変数で置き換えられる。参照)、intel fortran ではまだ実装されていないようです。

実行結果

ソース・プログラム

    program test
      implicit none
      type :: t_list
        integer, allocatable :: i(:)
      end type t_list
      type(t_list), allocatable :: list(:), tmp(:)
      integer :: i
      !
      do i = 1, 20
        tmp = [list, t_list([1:i])]   ! deep copy ! [1:i] non-standard
        call move_alloc(tmp, list)
      end do
      !
      do i = 1, 20
        print '(i3, a, 20i3)', i, ':', list(i)%i
      end do
      deallocate(list)
      stop
    end program test