Fortran:传递正确边界的可分配数组到子程序

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?),它们的行为是否正常?

1个回答

9
第一种方法将数组切片传递给子程序。请注意,边界信息不会通过这种方式传递,数组被假定从1开始,并到size(array)结束。
第二种方法与第一种方法类似,但您需要手动将下边界设置为0,这就是为什么打印v3(1:3)会给您带来一个1的偏移量。
第三种方法将所有数组信息(包括边界)传递给子程序,因此可以正确索引。在Fortran 2003中引入了传递allocatable数组的功能。
除了存在别名问题(将同一变量传递给三个不同的虚拟参数),这三种方法都是合法的。
您可以在此处找到所有标准文档。
特别是,请查看Fortran 2003标准,Ch. 5.1.2.5 DIMENSION attribute,以了解虚拟参数中假定形状延迟形状数组之间的区别。

谢谢您的回答,它会帮助我很多。在您给出的链接中,似乎在f95中也可以正常工作,是吗? - user2910558
所有标准文档都在那里提供,从IBM 704的Fortran(1957年!)开始。 - Alexander Vogt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接