Arrays 数组和指针形状
有人能解释一下为什么下面的程序不起作用,以及如何使它起作用吗? 在主程序中我分配了一个指针,在子程序Arrays 数组和指针形状,arrays,pointers,fortran,Arrays,Pointers,Fortran,有人能解释一下为什么下面的程序不起作用,以及如何使它起作用吗? 在主程序中我分配了一个指针,在子程序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)
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
谢谢
注:我正在使用gfortran(gcc 4.4.3)
编辑:对于gfortran 4.6,这段代码根本无法编译。我得到一个错误:
位于(1)的过程“sub”的伪参数“arr”具有需要此过程的显式接口的属性
要使用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