fortran,将可分配数组传递给具有右边界的子例程

时间:2013-10-23 09:30:56

标签: arrays fortran allocation subroutine

我需要在一个程序中将一些可分配的数组传递给子程序,我需要知道我的方式是否符合标准。

如果你知道我在哪里可以搜索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?中)是否正常?

1 个答案:

答案 0 :(得分:6)

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

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

第三种方法将所有数组信息传递给子例程(包括边界),因此“正确”索引。 Fortran 2003引入了传递allocatable数组。

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

您可以找到标准here的所有文件。

特别是,请查看Fortran 2003标准Ch. 5.1.2.5 DIMENSION attribute,以查看伪参数中假定形状延迟形状数组之间的差异。