在Fortran中在派生类型中声明变量与在子例程中声明变量之间有什么区别?

时间:2019-07-15 14:51:47

标签: oop module fortran derived-types

设置模块时,在派生类型定义中定义变量与在该模块的子例程中定义变量之间有什么区别?具体来说,我需要将数据从一个模块“传递”到另一个模块。例如,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

1 个答案:

答案 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中实体的任何其他模块(或程序)。