7

Fortranでは、3つのアプローチでサブルーチンから配列を返すことができます。1つ目は、intent(out)パラメーターを介したものです。2つ目は、配列をとして持つ関数を介したものresultです。result3つ目は、関数に割り当てられた配列へのポインタを持つ関数を持つことです。

各アプローチの長所と短所は何ですか?

4

2 に答える 2

5

関数が 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
于 2011-01-05T15:51:41.053 に答える
0
  1. 渡される配列のサイズについて想定する必要があるため、「intent(out)」が問題になる可能性があります。
  2. 配列を返すことも問題です。受け取る側のコードは、返される配列のサイズを想定しなければならないからです。
  3. 配列へのポインターには、サイズに関連する問題に加えて、ポインターが関連付けられているかどうかについての仮定の問題があります。
  4. 別の方法は、モジュールを作成することです。そのモジュールには、割り当て可能な配列と配列のサイズを詳細に示す整数の両方を含む型があります。
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 型を問題なく渡すことができます。配列を使い終わったら、配列の割り当てを解除することを忘れないでください...

于 2011-01-05T16:00:32.307 に答える