Fortranでは、3つのアプローチでサブルーチンから配列を返すことができます。1つ目は、intent(out)
パラメーターを介したものです。2つ目は、配列をとして持つ関数を介したものresult
です。result
3つ目は、関数に割り当てられた配列へのポインタを持つ関数を持つことです。
各アプローチの長所と短所は何ですか?
関数が 1 つの変数のみを変更し、他の出力を行わない場合は、関数 return を使用するのが私の習慣です。複数の変数が変更されるか、プロシージャが他のアクションを実行する場合、出力変数を引数リストに配置します。これはスタイルの選択です。ポインター、特に関数の引数として返されるポインターでメモリ リークが発生する可能性があるため、特定のケースでやむを得ない理由がない限り、このオプションは避けます。
更新: インテント (アウト) 配列引数に問題はありません...次の例に示すように、配列のサイズについて仮定する必要はありません:
module example_one
implicit none
contains
subroutine two_arrays ( in_arr, out_arr )
integer, dimension (:), intent (in) :: in_arr
integer, dimension (:), allocatable, intent (out) :: out_arr
integer :: i, len
len = size (in_arr)
allocate ( out_arr (1:len) )
do i=1, len
out_arr (i) = 3 * in_arr (i)
end do
return
end subroutine two_arrays
end module example_one
program test
use example_one
implicit none
integer, dimension (1:5) :: in_arr = [ 1, 2, 4, 5, 10 ]
integer, dimension (:), allocatable :: out_arr
write (*, *) allocated ( out_arr)
call two_arrays ( in_arr, out_arr )
write (*, *) size (out_arr)
write (*, *) out_arr
write (*, *) allocated ( out_arr)
deallocate ( out_arr )
write (*, *) allocated ( out_arr)
stop
end program test
module mymodule
type myvector
double precision,allocatable::values(:)
integer::length
end type
end module
次に、関数は次のようになります。
function myvecreturner(someparam)
use mymodule
type(myvector)::myvecreturner
integer::someparam
allocate(myvecreturner%values(someparam))
myvecreturner%length = someparam
end function
そして、これらの myvector 型を問題なく渡すことができます。配列を使い終わったら、配列の割り当てを解除することを忘れないでください...