gpt4 book ai didi

module - Fortran 中模块使用的模块的变量范围

转载 作者:行者123 更新时间:2023-12-02 19:30:54 27 4
gpt4 key购买 nike

我注意到(子)模块中由父模块使用的变量可以在主程序中仅通过父模块访问。这一概念清楚地区分了 Fortran 中的 use 语句和 C/C++ 中的 include 语句。以下程序清楚地说明了这个概念。

a.f90

module a_mod
use b_mod
implicit none

integer :: a
end module

b.f90

module b_mod
use c_mod
implicit none

integer :: b

end module

c.f90

module c_mod
implicit none

integer :: c = 10

contains

subroutine inc_c
c = c + 10
end subroutine inc_c
end module

测试.f90

program test
use a_mod
implicit none

call inc_c
write(*,*),c
end program

请注意,我可以仅使用 a_mod 来调用 c_mod 中的函数。请注意,除非遍历依赖项列表,否则我无法直接观察到 c_mod 可用。

但是在复杂的软件中,是否有一种简单的方法可以知道(例如,使用 IDE)变量是否可在特定行使用?

最佳答案

在我看来,最好的办法是避免使用一揽子 use 语句,特别是对于大型且有时难以操作的模块。相反,通过 only 关键字指定要继承的模块实体,例如:

program main
use a_mod, only : c, inc_c
implicit none

call inc_c
write(*,*) c
end program main

这可行,但令人困惑,因为 a_mod 不是 cinc_c 的真正所有者。因此,您应该尝试从实际声明的地方使用实体,这会给出:

program main
use c_mod, only : c, inc_c
! ^ This has changed
implicit none

call inc_c
write(*,*) c
end program main

现在,任何阅读代码的人都可以清楚地知道哪些变量和子例程在作用域内以及它们来自何处。

最后,这还有一个额外的好处,即降低您使用 c 而没有意识到它实际上继承自 c_mod 的风险。当不使用implicit none时,这尤其是一个问题!

关于module - Fortran 中模块使用的模块的变量范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42474530/

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