2

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

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

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

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

module sim2_mod
contains
include "sim2.f90"
end

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

4

1 回答 1

4

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

当你这样做的时候,你也可以让它成为一个模块,并在sim_main. 一旦你做到了这一点,你可以在语句上添加一个only带有一些重命名的子句,并以use这种方式解决名称冲突。

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

这种方法实施起来可能很麻烦,并且确实增加了下一个版本sim1也需要重新设计的可能性。但是,是不是该告诉开发人员sim1放弃通用块并实现一些更现代的东西了?

于 2012-07-13T18:21:34.710 回答