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 中虚拟参数的三种方式是否合法(在什么版本的 fortran、90、95、2003 中?)并且它们的行为是否正常?

4

1 回答 1

9

第一个版本将数组切片传递给子例程。请注意,边界信息不会以这种方式传递,假设数组从 开始1并转到size(array)

第二种方式与第一种方式一样,但您手动将下边界设置为0,这就是为什么打印v3(1:3)会为您提供偏移量为 的值1

第三种方式将所有数组信息传递给子程序(包括边界),因此是“正确的”索引。allocatableFortran 2003 引入了传递数组。

除了您有一个别名问题(将相同的变量传递给三个不同的虚拟参数)之外,所有三个版本都是合法的。

您可以在此处找到标准的所有文件。

特别是,查看 Fortran 2003 标准,了解虚拟参数中假定形状数组和延迟形状Ch. 5.1.2.5 DIMENSION attribute数组之间的差异。

于 2013-10-23T09:43:19.577 回答