Fortran命名空间冲突

时间:2012-07-13 16:31:40

标签: namespaces fortran fortran-common-block

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

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

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

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

module sim2_mod
contains
include "sim2.f90"
end

因为这应该将sim2中的所有例程放入sim2_mod命名空间中,该命名空间可能是有限的use d。这是一个好主意吗?一个坏主意?有没有这种情况不起作用的情况? sim2中使用的公共块是否仍具有全局范围?

1 个答案:

答案 0 :(得分:4)

好吧,如果sim2.f90只包含一些行,这些行在拼接到您建议的sim2_mod时形成一个语法上有效的Fortran源文件,那么您的建议就可以了。如果不是,您必须编辑源。

在您这样做的同时,无论如何都可以将其作为模块并使用 - 在sim_main中关联它。一旦你到目前为止,你可以在only语句中添加一个use子句,并进行一些重命名,并以此方式处理名称冲突。

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

这种方法实施起来很麻烦,并且确实提高了sim1的下一版本也需要重新编写的可能性。但是,当你告诉sim1的开发人员放弃常见的块并实现更现代的东西时,是不是时候了?