我需要在程序中将一些可分配的数组传递给子例程,并且我需要知道我的方式是否符合标准。
如果您知道可以在哪里搜索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
并转到size(array)
。
第二种方法与第一种类似,但是您将下边界手动设置为0
,这就是为什么打印v3(1:3)
为您提供偏移量为的值的原因1
。
第三种方式将所有数组信息传递给子例程(包括边界),因此将“正确”索引。传递allocatable
数组是在Fortran 2003中引入的。
除了存在别名问题(将相同的变量传递给三个不同的伪参数)外,所有三个版本都是合法的。
您可以在此处找到该标准的所有文档。
特别是,请看一下Fortran 2003 Standard,Ch. 5.1.2.5 DIMENSION attribute
以了解虚拟参数中假定形状和递延形状数组之间的差异。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句