我用 Fortran 90 编写了一个程序,它从文本文件中读取数百个输入,并对它们执行许多不同的顺序操作。
我不想继续将这数百个值传递给每个子例程(有很多!)。有没有办法可以将从该文件中读取的数据保存到任何子程序都可以访问的全局变量中?我想我可以以某种方式将这些值保存到每个子例程都可以调用的模块中,但我不确定该怎么做。
您只需将变量放入一个模块中,然后从每个子例程中使用该模块。或者在同一个模块中有子程序。这是现代 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
与模块变量的使用正交,考虑使用一个或多个派生类型将“数百个值”组合在一起(以某种方式相关的值被分组为特定的派生类型)。
(在更基本的层面上,有时以数组而不是一系列标量表示信息更适合该信息的性质 - 因此在数组中存储和传递该信息。)
这使得理解程序中的信息流变得更加容易——在过程引用的站点上,阅读您的代码的人不一定知道被引用的过程可能访问的模块和模块变量。在某些情况下,它还可以使您将来更容易扩展程序 - 如果它们以派生类型而不是一系列模块变量来描述,则更容易拥有多个现存的事物实例。
所以而不是:
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
...
在其他情况下,模块变量可能更合适——拆分是一个判断问题。