什么时候模块超出了Fortran 90/95的范围?

时间:2012-12-12 16:40:28

标签: module fortran fortran90 fortran95

我的预期用途是

program main
  use mod

  external sub

  call sub
end program main

subroutine sub
  ! code here calls subroutines in mod
end subroutine sub

具体而言,module mod中的subroutine sub是否在范围内?另外,当模块进入/超出范围时,我更有兴趣了解更多信息。我正在使用gfortran 4.6.1,如果重要的话。

1 个答案:

答案 0 :(得分:4)

它不在子程序sub的范围内,因为sub不能调用例程或使用mod中的变量,因为sub不是程序main的一部分。它们没有任何共同点,是单独的编译单元,只能相互调用(如果它们可以调用)。

考虑一下:

program main

  external sub

  call sub
end program main

subroutine sub
  use mod
  ! code here calls subroutines in mod
end subroutine sub

在这里,您可以使用modsub的变量和例程,因为sub明确使用了mod

另一个示例,其中submain的内部过程:

program main
  use mod

  call sub

  contains

    subroutine sub
      ! code here calls subroutines in mod
    end subroutine sub

end program main

同样在这种情况下,您可以使用modsub的内容,因为main中的所有内容都在sub范围内。

最后,在这种情况下mod不在范围内,它与原始案例类似。

program main
  use mod
  use mod2

  call sub
end program main

module mod2

  contains

    subroutine sub

      ! code here calls subroutines in mod
    end subroutine sub

end module mod2

另一个问题是当模块变量超出范围时,它们将被取消定义。 Fortran 2008通过隐式地save隐藏所有模块变量来解决这个问题。