【问题标题】:What are submodules and how are they used?什么是子模块以及它们是如何使用的?
【发布时间】:2014-04-03 00:53:36
【问题描述】:

我不太了解子模块的用途。我知道大多数编译器对它们的支持很少,但这个概念很有趣。我想我理解了基本概念,但我看到的所有示例(Fortran Wiki、Modern Fortran Explained、技术报告)都很简单,使用完全相同的示例(point 全部在同一个文件中输入)并且不要在调用函数时显示它们的实际用途。在什么情况下你想使用子模块?当你想使用一个子模块时,你是否包含一个 use 语句?如果有人可以提供一个例子,我真的很想。

【问题讨论】:

  • 我会在接下来的一两周内在 Fortran wiki 上添加更多内容(包括示例)。
  • 另外,如果您有技术报告或标准,请查看附录C中的示例。
  • 子模块是 Fortran 2008 的一个特性。如果有足够声誉点的人创建了“fortran2008”标签,那就太好了。已经有fortran77、fortran90、fortran95、fortran2003标签了。

标签: fortran


【解决方案1】:

简单的答案是,当您希望父模块或子模块中的代码更少时,您可以将代码放入子模块中。

您可能希望在父模块或子模块中包含更少的源代码,因为父模块的源代码太长了。

在子模块之前,唯一可行的方法是将源代码从模块中移出到不同的模块或外部过程中。但是,如果要移动的源代码引用了保留在原始模块中的私有事物或组件,这并不总是可能的。子模块可以通过主机关联访问其父模块或子模块中声明的事物 - 源代码仍然可以访问 PRIVATE 事物,就像它仍然是父物理源代码的一部分时一样。

如果与您的处理器相关,您可能还希望将源代码从父模块中分离出来以避免编译级联。对模块的更改通常需要重新编译该模块(及其后代),然后重新编译使用该模块(及其后代)的所有程序单元,重复级联以进一步重新编译,其中任何重新编译的程序单元本身就是模块。对子模块的更改通常只需要重新编译该子模块及其任何后代子模块。

子模块的分层性质也可能适合分层代码排列 - 您不希望同一层次结构中的兄弟姐妹能够直接访问它们定义的实体和过程。

USE 语句仅用于您想要访问模块提供的范围内的事物的情况。您不能在 USE 语句中“使用”子模块(尽管在模块中定义其 INTERFACE 的过程可能在子模块中定义其主体)。

模块的子模块不使用父模块(它不能 - 这有点像模块试图使用自身)并且不需要 - 它已经可以通过主机访问模块中的内容协会。启动子模块程序单元的子模块语句标识它扩展的模块(可能还有另一个子模块)。模块的源代码中没有任何内容可以告诉它有多少子模块可以扩展它。

【讨论】:

  • 感谢您的信息。我最感兴趣的部分以及促使我提出这个问题的部分是关于在不创建包含所有派生类型的整体模块的情况下访问派生类型的父级的私有数据和过程。因此,为了使用包含在子模块中的过程,您只需要使用它扩展的模块(因为没有更好的词),就像它都在那个单个 mdoule 中一样?
  • 模块本身有你要调用的过程的独立接口体。定义过程的子程序可以在子模块中。然后 USE 的任何模块(或模块的后代)都可以引用该过程。
猜你喜欢
  • 1970-01-01
  • 2018-01-25
  • 2011-07-04
  • 2017-10-26
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
相关资源
最近更新 更多