このページでは、Fortranの仮引数の形態に関して纏めておく。OpenACC では、仮引数となる配列の一部の形状が使用できない制約事項があるため、備忘録として以下の主な配列の形状について簡単に纏めておく。
形状明示配列は、FORTRSAN77 の時代から使用されてきた仮引数の形状、形態である。すなわち、サブルーチン側には、「配列」とその「大きさ(寸法)」を変数として渡す方式である。この大きさ変数を用いて、配列のサイズを含めて宣言を行う。
subroutine sub(a, n) ! 配列aと配列寸法nを仮引数としている integer :: n real(8) :: a(n, n) ...
形状引継ぎ配列は、寸法を明示しないで仮引数となる配列を宣言する方法である。一般に、配列の各次元をコロン : で表す。形状引継ぎ配列を使用する場合は、配列の寸法を引数にする必要がないため、プログラミングの自由度が広がるが、これは「モジュール副プログラム」内でしか使用できない。すなわち、MODULE 内での副プログラムの定義が必要である。「モジュール副プログラム」ではなく、一般的な「外部副プログラム」内で形状引継ぎ配列を宣言する場合は、明示的にインターフェース・モジュールを用いなければならない。(コンパイルは成功したとしとしても、実行時に segmentation fault で abort する場合が多い)
module TestMod implicit none contains subroutine sub( a ) integer :: i, n, m real(8) :: a(:, :) ! 形状引継ぎ配列, 寸法を : で表す n = size(a,1) ! 1次元目の寸法 m = size(a,2) ! 2次元目の寸法 do i = 1, n write (*, *) a(i, 1:m) end do end subroutine end module
大きさ引継ぎ配列とは、実引数の配列の大きさ(全要素)を副プログラム上の仮配列で受け継ぐ際の仮配列を言う。配列の寸法、形状を * で表す。
module TestMod implicit none contains subroutine sub( a , m ) ! 仮引数配列 a integer :: m real(8) :: a(*) ! 1次元の大きさ引継ぎ配列として受ける(全要素を受ける) print *, "a =", a(1:m) end subroutine end module program main use TestMod implicit none integer, parameter :: n = 10 integer :: i, j real(8), dimension :: a(n, n) ! 2次元の配列 do i = 1, n do j = 1, n a(i,j) = i*j end do end do call sub( a, n*n ) ! a 実引数は2次元の配列として渡す end program