kxk*_*607 4 fortran gfortran fortran77 fortran-common-block
目前,在我的程序中,我有几个公共块分布在多个子程序和函数中。有时,当我向公共块添加变量时,我会忘记更改公共块的所有实例。我想将这些公共块放入模块中,这样我就可以在一处向模块添加和删除变量,而不必担心在子程序中更新模块的所有实例。
我是否需要在程序中包含“use”语句来初始化模块中的变量,还是将程序包含在模块中?我通常会为此使用通用块,但我正在尝试实现模块,因为我认为它们将帮助我的代码在复杂性增加时保持可读性。
注意:模块中变量的某些值在从一个程序传递到另一个程序时需要能够更改。
我尝试编写一个简化的测试程序来熟悉模块,但无法让它工作。我熟悉 fortran 77 但以前从未使用过模块。我很感激任何帮助或建议。
我正在使用 gfortran 4.6.1
主程序.f
program main
use Words
use Vals
double precision x,y,z
character*5 Greet
integer i
Greet = 'Hello'
x = 4.1
y = 5.2
z = 10.0
i = 3
call foo ()
end program main
subroutine foo ()
use Words
use Vals
print *, Greet
z = x + y
print *, z
print *, i
end subroutine
module Words
character*5 Greet
save
end module
module Vals
double precision x,y
integer int
save
end module
Run Code Online (Sandbox Code Playgroud)
您只需要一个模块的一个实例。您可以通过语句使任何使用它的主程序或过程(子例程或函数)都知道它use
。如果您有一个设置值的子例程,则与其他子例程一样,它必须有一个use
语句。如果要设置初始值,您可以在声明中这样做。如果该模块由主程序使用,那么它将始终在范围内,并且变量的值将在程序运行的整个过程中持续存在。如果模块仅由过程使用,原则上,当这些过程都不在调用链中并且允许编译器忘记模块变量的值时,模块将超出范围。(值得怀疑的是,任何 Fortran 编译器实际上都会这样做。)可以通过用 声明每个变量来防止这种情况SAVE
。 SAVE
如果您使用初始值声明变量,则它是隐式的。
通常,您必须在使用模块之前先对其进行编译,以便编译器在遇到 use 语句时“知道”它们。这可以通过将它们放在文件的前面或首先编译它们的文件来完成。这是重新排序的示例:
module Words
character*5 Greet
save
end module
module Vals
double precision x,y
integer i
save
end module
module my_subs
contains
subroutine foo ()
use Words
use Vals
double precision :: z
print *, Greet
z = x + y
print *, z
print *, i
end subroutine
end module my_subs
program main
use Words
use Vals
use my_subs
Greet = 'Hello'
x = 4.1
y = 5.2
i = 3
call foo ()
end program main
Run Code Online (Sandbox Code Playgroud)