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