将程序输入保存到模块以供“全局”使用

时间:2012-09-05 19:24:22

标签: fortran fortran90 fortran95

我在Fortran 90中编写了一个程序,该程序从文本文件中读取数百个输入,并对它们执行许多不同的顺序操作。

我不想继续将这几百个值传递给每个子例程(有很多!)。有没有办法可以将我从此文件中读取的数据保存到任何子程序都可以访问的全局变量中?我想我可以将这些值保存到每个子程序可以调用的模块中,但我不确定如何这样做。

2 个答案:

答案 0 :(得分:5)

您只需将变量放入模块中,然后使用每个子程序中的该模块。或者将子程序放在同一个模块中。这是现代Fortran中全局变量的首选方法;优于普通块。常见块增加了存储序列的不必要的复杂性。原则上,您应该在每个声明中包含SAVE,因为如果模块超出范围,则允许丢失值,也就是说,如果在程序执行期间主程序或任何子程序都没有使用该模块。可能没有编译器实际上这样做。

module my_mod

  real, dimension (100) :: array
  integer :: OneInt

contains

subroutine X

end subroutine X

end module my_mod

program my_prog


use my_mod

read ()  array

call subroutine X

end program my_prog

答案 1 :(得分:4)

与模块变量的使用正交,考虑使用一个或多个派生类型将“数百个值”(以某种方式相关的值分组为特定派生类型)组合在一起。

(在更基本的层面上,有时在数组中而不是一系列标量中表示信息更适合于该信息的性质 - 因此在数组中存储并传递该信息。)

这使得理解程序中的信息流变得更加容易 - 在过程引用的站点上,读取代码的人将不一定知道引用过程可能访问的模块和模块变量。在某些情况下,它还可以使您以后更容易扩展程序 - 如果在派生类型中描述它们而不是作为一系列模块变量,则更容易拥有多个现存的实例。

所以而不是:

SUBROUTINE proc( temperature, pressure,  &
    composition_a, composition_b, composition_c )
  REAL, INTENT(IN) :: temperature, pressure,  &
      composition_a, composition_b, composition_c
...

考虑:

TYPE State
  REAL :: temperature
  REAL :: pressure
  REAL :: composition(3)
END Type State
...
SUBROUTINE proc(system_state)
   TYPE(State), INTENT(IN) :: system_state
...

在其他情况下,模块变量可能更合适 - 分裂是一个判断问题。