gpt4 book ai didi

namespaces - 在 Fortran 90 中模拟命名空间

转载 作者:行者123 更新时间:2023-12-04 03:30:51 25 4
gpt4 key购买 nike

Fortran 90 最麻烦的问题之一是缺少命名空间。在上一个问题“How do you use Fortran 90 module data”中来自 Pete ,已经讨论了 USE 在 Python 中表现得像“从模块导入 *”的主要问题:在模块中声明为公共(public)的所有内容都在导入模块的范围内按原样导入。没有前缀。这使得在阅读一些代码时非常非常难以理解给定标识符的来源以及给定模块是否仍在使用。

在我上面链接的问题中讨论的一个可能的解决方案是使用 ONLY 关键字来限制导入的标识符和它们来自的文档,尽管当模块非常大时这非常非常乏味。保持模块小,并始终使用 USE : ONLY 是解决 Fortran 9X 中缺少命名空间和限定前缀的潜在好策略。

还有其他(不一定更好)的解决方法吗? Fortran 2k3 标准是否对命名空间支持有任何说明?

最佳答案

没有其他人将此建议作为答案提出(尽管有人在一个答案的评论中这样做了)。所以我要提交这个,希望它可以帮助别人。
您可以通过以下方式模拟 namespace ,我希望编译器不会因此而对性能造成明显影响(如果是这样的话,所有面向对象的 Fortran 编程都会受到影响)。我在我的生产代码中使用这种模式。对我来说唯一真正的缺点是缺少派生类型包含的参数变量,但我在下面也提供了一个选项。

Module Math_M

IMPLICIT NONE

PRIVATE

public :: Math

Type Math_T
real :: pi=3.14159
contains
procedure, nopass :: e => math_e
procedure :: calcAreaOfCircle => math_calcAreaOfCircle
End Type

Type(Math_T) :: Math
real, parameter :: m_e = 2.71828

contains

function math_e() result(e)
real :: e
e = m_e
end function math_e

function math_calcAreaOfCircle(this, r) result(a)

class(Math_T), intent(in) :: this
real, intent(in) :: r

real :: a

a = this%pi * r**2.0
end function math_calcAreaOfCircle
End Module Math_M
以及用法
Program Main

use Math_M

IMPLICIT NONE

print *, Math%pi
print *, Math%e()
print *, Math%calcAreaOfCircle(2.0)


End Program Main
我个人更喜欢使用 $超过 _对于模块变量,但不是所有没有编译器标志的编译器。希望这对将来的某人有所帮助。

关于namespaces - 在 Fortran 90 中模拟命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3874585/

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