Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 子模块是什么?它们是如何使用的?_Fortran - Fatal编程技术网

Fortran 子模块是什么?它们是如何使用的?

Fortran 子模块是什么?它们是如何使用的?,fortran,Fortran,我不太明白子模块的用途。我知道大多数编译器对它们的支持很少,但这个概念很有趣。我想我理解基本概念,但我看到的所有示例(Fortran Wiki、现代Fortran解释、技术报告)都过于简单,使用完全相同的示例(pointtype all in the same file),并且在调用函数时不显示它们的实际用途。在什么情况下,您希望使用子模块?当您想使用子模块时,是否包含use语句?我真的希望有人能提供一个例子。简单的答案是,当您希望父模块或子模块中的代码更少时,您可以将代码放入子模块中 您可能希

我不太明白子模块的用途。我知道大多数编译器对它们的支持很少,但这个概念很有趣。我想我理解基本概念,但我看到的所有示例(Fortran Wiki、现代Fortran解释、技术报告)都过于简单,使用完全相同的示例(
point
type all in the same file),并且在调用函数时不显示它们的实际用途。在什么情况下,您希望使用子模块?当您想使用子模块时,是否包含use语句?我真的希望有人能提供一个例子。

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

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

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

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

子模块的层次性也可能适合层次代码安排——在这种情况下,您不希望层次结构相同级别的同级能够直接访问它们定义的实体和过程

USE语句仅在您希望访问模块提供的范围内的内容时使用。不能在use语句中“使用”子模块(尽管在模块中定义了接口的过程可能在子模块中定义了其主体)


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

我将在未来一两周在Fortran wiki上添加更多的内容(包括示例)。此外,如果您有技术报告或标准,请查看附录C中的示例。子模块是Fortran 2008的一项功能。如果有人拥有足够的声望点,能创建一个“fortran2008”标签,那就太好了。已经有fortran77、fortran90、fortran95和fortran2003标记。感谢提供信息。我最感兴趣的部分,也是迫使我问这个问题的部分,是关于访问派生类型的父级的私有数据和过程,而不创建包含所有派生类型的单片模块。因此,为了使用子模块中包含的过程,您只需使用它扩展的模块(因为没有更好的词),就好像它都在单个mdoule中一样?模块本身有单独的接口主体,用于您要调用的过程。然后,定义过程的子程序可以位于子模块中。然后,使用模块(或模块的后代)的任何内容都可以引用该过程。