gpt4 book ai didi

namespaces - Fortran 命名空间冲突

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

我正在将几个模拟代码耦合在一起。目前,有 3 个代码,但将来可能会更多。您可以在下图中考虑信息交换:

 sim1  <====>  sim_main <=====> sim2

信息交换是通过每一侧的有限接口(interface)完成的。

我最近诊断出一个问题,sim1 中的一个公共(public) block 与 sim2 中的子程序同名,这导致了段错误。简单的解决方案是更改 sim1 中公共(public) block 的名称,但这并不理想,因为如果 sim1 的开发人员推出了 sim1-2.0,那么我将不得不再次挖掘并更改该公共(public) block 的名称。由于接口(interface)相对有限,我想知道是否更好的解决方案是编写一个简单的模块:
module sim2_mod
contains
include "sim2.f90"
end

因为这应该将 sim2 中的所有例程放入 sim2_mod 命名空间,该命名空间可能是 use d 在有限的基础上。这是一个好主意吗?一个坏主意?有没有这行不通的情况? sim2 中使用的通用 block 是否仍然具有全局范围?

最佳答案

好吧,如果 sim2.f90仅包含在拼接到您建议的 sim2_mod 时的行,形成一个语法有效的 Fortran 源文件,您的建议将起作用。如果没有,您将不得不编辑源代码。

当你这样做的时候,你不妨让它成为一个模块,并在 sim_main 中使用关联它。 .一旦你做到了,你可以添加一个 only use 上的子句,经过一些重命名声明和解决名称冲突的方式。

通用 block 确实在整个程序中具有全局范围,我认为 Fortran 编写社区内的共识是,避免这种全局可用性可能导致的问题的首选方法是替换它们,而不仅仅是您当前面临的问题带有一个模块,该模块定义了公共(public) block 包含的所有变量。然后,您可以使用模块变量对(以前的)全局变量的可用性和命名进行更多控制。

这种方法实现起来可能很麻烦,并且确实会增加 sim1 的下一个版本的可能性。也将需要返工。但是,是不是该告诉 sim1 的开发人员了?放弃常见的 block 并实现一些更现代的东西?

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

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