设置模块时,在派生类型定义中定义变量与在该模块的子例程中定义变量之间有什么区别?具体来说,我需要将数据从一个模块“传递”到另一个模块。例如,MathStuffModule
在子例程中添加了一些数字,然后PrintStuffModule
打印了这些数字(实际问题要复杂得多,但我仍在尝试了解基本知识)。
例如,在下面的代码中,变量“ answer”和“ AddThis”之间的区别是什么,它们分别与模块如何关联,如何/是否可以在模块外部调用它们(并说通过到PrintStuffModule),然后在实际程序中调用/定义变量?
module MathStuffModule
type MathStuffType
integer :: answer
contains
procedure :: mathstuff1
end type MathStuffType
contains
subroutine mathstuff1(m,AddThis,number)
class(MathStuffType) :: m
real :: AddThis,number,answer
m%answer = number + AddThis
end subroutine mathstuff1
end module MathStuffModule
答案 0 :(得分:2)
这更多是评论而不是答案,我不确定100%OP到底在问什么。
模块实体可在任何包含use
语句的范围内使用;在此示例中,它将为use mathstuffmodule
。
一个范围内能够操纵在另一个范围内定义的实体的这项业务称为 use-association ,它的全部目的是通过巧妙地使用{{1 }}语句。
可选地,use
语句可以通过使用use
子句来限制关联的模块实体,或者可以重命名模块实体,以便在使用范围中以不同的名称来识别它们。
为简单起见,在此阶段仅考虑程序的使用模块。如果程序包含only
语句,则只要任何程序实体在范围内,任何模块实体都在范围内。程序实体(以及与程序有使用关联的实体)通常在整个程序执行的范围内,但可能会在子作用域中被掩盖。
我不会将use
称为变量,而是将其称为派生类型answer
的成员。如果在程序范围内声明了该类型的实体,则可以使用诸如mathstufftype
之类的术语来访问该成员。
我也不会将entity%answer
称为变量,它是例程addthis
的伪参数名称。在例程之外使用名称mathstuff1
来引用该参数将是错误的。 (如果您想弄混事情,可以在另一个作用域中声明一个名为addthis
的变量。)
孤立地,没有addthis
的东西,也没有answer
的东西,它们可以由模块的客户端addthis
进行像变量一样的操作。
考虑模块之间的数据传递可能也无济于事。如果程序使用两个模块,则它可以访问在两个模块中定义的任何实体,并且可以将一个模块中定义的变量用作另一个模块中定义的例程的参数。模块A到use
模块B也有可能;那么(a)B中的代码可以操纵与A相关的使用相关实体,以及(b)use
B也可以(传递)访问A中实体的任何其他模块(或程序)。