6

プログラムでいくつかの割り当て可能な配列をサブルーチンに渡す必要があり、その方法が標準に準拠しているかどうかを知る必要があります。

Fortran の標準を検索できる場所を知っている場合は、教えてください。

これは、言葉よりも説明しやすい小さなコードです

program test

use modt99

implicit none

real(pr), dimension(:), allocatable :: vx

allocate(vx(-1:6))
vx=(/666,214,558,332,-521,-999,120,55/)
call test3(vx,vx,vx)
deallocate(vx)

end program test

モジュール modt99 で

module modt99

contains
subroutine test3(v1,v2,v3)
  real(pr), dimension(:), intent(in) :: v1
  real(pr), dimension(0:), intent(in) :: v2
  real(pr), dimension(:), allocatable, intent(in) :: v3

  print*,'================================'
  print*,v1(1:3)
  print*,'================================'
  print*,v2(1:3)
  print*,'================================'
  print*,v3(1:3)
  print*,'================================'

end subroutine test3


end module modt99

画面上で、私は得る

 ================================
   666.000000000000        214.000000000000        558.000000000000     
 ================================
   214.000000000000        558.000000000000        332.000000000000     
 ================================
   558.000000000000        332.000000000000       -521.000000000000     
 ================================

サブルーチン test3 の仮引数の 3 つの方法は正当であり (fortran、90、95、2003 のどのバージョンで?)、それらの動作は正常ですか?

4

1 に答える 1

9

最初のバージョンは、配列スライスをサブルーチンに渡します。境界情報はこの方法では渡されないことに注意してください。配列は から始まり、1に進むと想定されsize(array)ます。

2 番目の方法は最初の方法と同じですが、手動で下限を に設定します。0そのため、印刷v3(1:3)するとオフセットが の値が得られます1

3 番目の方法では、すべての配列情報 (境界を含む) がサブルーチンに渡されるため、「正しい」インデックス付けが行われます。配列の受け渡しallocatableは、Fortran 2003 で導入されました。

エイリアシングの問題 (同じ変数を 3 つの異なる仮引数に渡す) があることを除けば、3 つのバージョンはすべて有効です。

規格のすべてのドキュメントは、ここにあります。

特に、Fortran 2003 標準を調べて、仮引数の想定形状配列と遅延形状Ch. 5.1.2.5 DIMENSION attribute配列の違いを確認してください。

于 2013-10-23T09:43:19.577 に答える