gpt4 book ai didi

fortran - 从 Fortran 77 的多个通用 block 制作多个模块

转载 作者:行者123 更新时间:2023-12-02 10:23:33 26 4
gpt4 key购买 nike

目前在我的程序中,我有几个公共(public) block 分布在多个子程序和函数中。有时,当我向公共(public) block 添加变量时,我会忘记更改公共(public) block 的所有实例。我想将这些公共(public) block 放入模块中,这样我就可以在一处向模块添加和删除变量,而不必担心在子程序中更新模块的所有实例。

我是否需要在程序中包含“use”语句来初始化模块中的变量,还是将程序包含在模块中?我通常会为此使用通用 block ,但我正在尝试实现模块,因为我认为它们将帮助我的代码在复杂性增加时保持可读性。

注意:模块中变量的某些值需要能够在从一个程序传递到另一个程序时发生更改。

我尝试编写一个简化的测试程序来熟悉模块,但无法让它工作。我熟悉 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

最佳答案

您只需要一个模块的一个实例。您可以通过 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

关于fortran - 从 Fortran 77 的多个通用 block 制作多个模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14262169/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com