有人可以解释一下为什么以下程序不起作用,以及如何使其工作?
在主程序中我分配一个指针,在子程序sub
中,我寻找数组的形状并得到错误的值。
program test
real, pointer, dimension(:,:,:) :: arr
allocate(arr(3,5,7))
print *, "In test: ",shape(arr)
call sub(arr)
print *, "Back in test: ",shape(arr)
end program test
subroutine sub(arr)
real, pointer, dimension(:,:,:) :: arr
print *, "In sub: ",shape(arr)
end subroutine
输出:
In test: 3 5 7
In sub: 12694064 1 3
Back in test: 3 5 7
由于
PS:我正在使用gfortran(gcc 4.4.3)
编辑:使用gfortran 4.6,这段代码根本无法编译。我收到错误:
(1)中过程'sub'的虚拟参数'arr'有一个属性,需要为此过程提供显式接口
答案 0 :(得分:9)
要使用Fortran 90/95/2003/2008的“高级”功能,调用程序应该知道过程(子例程和函数)的接口。这称为“显式”接口。 gfortran 4.6告诉你问题是什么。最简单的方法是将您的程序放在一个模块中。试试这个:
module mysubs
implicit none
contains
subroutine sub(arr)
real, pointer, dimension(:,:,:) :: arr
print *, "In sub: ",shape(arr)
end subroutine
end module mysubs
program test
use mysubs
implicit none
real, pointer, dimension(:,:,:) :: arr
allocate(arr(3,5,7))
print *, "In test: ",shape(arr)
call sub(arr)
print *, "Back in test: ",shape(arr)
end program test