数组和指针形状

时间:2012-02-21 09:02:57

标签: 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)
  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'有一个属性,需要为此过程提供显式接口

1 个答案:

答案 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