ONLY 子句并从级联中的模块继承
The ONLY clause and inheriting from modules in a cascade
我使用以下层次结构在三个不同的模块(在三个不同的文件中)定义了三种类型:
MODULE module1 (low_level)
IMPLICIT NONE
TYPE type1
real(kind=kind(0.d0)) :: var1
END TYPE type1
... more declarations ...
END MODULE module1
MODULE module2 (medium_level)
USE module1, only : type1
IMPLICIT NONE
TYPE type2
type(type1) :: var2
END TYPE type2
... more declarations ...
END MODULE module2
MODULE module3 (high_level)
USE module2, only : type2
IMPLICIT NONE
TYPE type3
type(type2) :: var3
END TYPE type3
... more declarations ...
END MODULE module3
现在我有另一个模块,其中定义了模块过程:
MODULE module4
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1(var4)
USE module3, only : type3
IMPLICIT NONE
type(type3), intent(inout) :: var4
type(type1) :: var5
... using var5 ...
END SUBROUTINE sub1
END MODULE module4
在子程序sub1
中编译module4
时编译器报错:
Error: Derived type 'type1' at (1) is being used before it is defined
在子程序中添加一个USE module1, only : type1
问题解决
但是,鉴于子例程sub1
使用module3
,它使用module2
,而module2
使用module1
,我不明白为什么我需要告诉编译器"re-declare" type1
已在 module1
中声明并由 module3
通过 module2
由 USE
语句使用,继承的概念应适用于此。如果您必须编写每个模块依赖项,我看不到使用模块调用其他模块的优势...
我肯定可能误解了什么,任何解释将不胜感激。
如果你这样做
module module2
USE module1, only : type1
module module3
USE module2, only : type2
您无法在 module3
中访问 type1
,因为您仅导入 type2
。
看来你想要
module module3
USE module2, only : type1, type2
我使用以下层次结构在三个不同的模块(在三个不同的文件中)定义了三种类型:
MODULE module1 (low_level)
IMPLICIT NONE
TYPE type1
real(kind=kind(0.d0)) :: var1
END TYPE type1
... more declarations ...
END MODULE module1
MODULE module2 (medium_level)
USE module1, only : type1
IMPLICIT NONE
TYPE type2
type(type1) :: var2
END TYPE type2
... more declarations ...
END MODULE module2
MODULE module3 (high_level)
USE module2, only : type2
IMPLICIT NONE
TYPE type3
type(type2) :: var3
END TYPE type3
... more declarations ...
END MODULE module3
现在我有另一个模块,其中定义了模块过程:
MODULE module4
IMPLICIT NONE
CONTAINS
SUBROUTINE sub1(var4)
USE module3, only : type3
IMPLICIT NONE
type(type3), intent(inout) :: var4
type(type1) :: var5
... using var5 ...
END SUBROUTINE sub1
END MODULE module4
在子程序sub1
中编译module4
时编译器报错:
Error: Derived type 'type1' at (1) is being used before it is defined
在子程序中添加一个USE module1, only : type1
问题解决
但是,鉴于子例程sub1
使用module3
,它使用module2
,而module2
使用module1
,我不明白为什么我需要告诉编译器"re-declare" type1
已在 module1
中声明并由 module3
通过 module2
由 USE
语句使用,继承的概念应适用于此。如果您必须编写每个模块依赖项,我看不到使用模块调用其他模块的优势...
我肯定可能误解了什么,任何解释将不胜感激。
如果你这样做
module module2
USE module1, only : type1
module module3
USE module2, only : type2
您无法在 module3
中访问 type1
,因为您仅导入 type2
。
看来你想要
module module3
USE module2, only : type1, type2