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

What is the difference between declaring variables within the derived type vs. within subroutine in Fortran?

设置模块时,在派生类型定义中定义变量与在该模块的子例程中定义变量有什么区别?具体来说,我需要 'pass' 从一个模块到另一个模块的数据。例如 MathStuffModule 在子程序中添加一些数字,然后 PrintStuffModule 打印这些数字(实际问题要复杂得多,但我仍在努力了解基础知识)。

例如在下面的代码中,变量 "answer" 和 "AddThis" 之间的区别是什么,就它们各自与模块的关系而言, how/if 它们可以被称为在模块外部(并说传递给 PrintStuffModule),以及 calling/defining 实际程序中的变量?

        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

这更像是一个扩展评论而不是一个答案,我不是 100% 确定 OP 在问什么。

模块实体在包含 use 语句的任何范围内可用;在此示例中,它将是 use mathstuffmodule

一个范围内能够操作另一个范围内定义的实体的业务称为use-association,它是关于在(可能复杂且长的)程序中关联实体通过巧妙地使用 use 语句。

可选地,use 语句可以通过使用 only 子句来限制关联的模块实体,或者它可以重命名模块实体,以便它们在使用范围内以不同的名称为人所知。

为简单起见,在此阶段仅考虑程序使用模块。如果程序包含 use 语句,则只要任何程序实体在范围内,任何模块实体都在范围内。程序实体(以及程序中的实体 use-associated)通常在整个程序执行过程中都在范围内,但可能会在 sub-scopes.

中被屏蔽

我不会称 answer 为变量,我会称其为派生类型 mathstufftype 的成员。如果在程序范围内声明了该类型的实体,则可以通过类似 entity%answer.

的术语访问该成员

我也不会将 addthis 称为变量,它是例程 mathstuff1 的虚拟参数名称。在例程之外使用名称 addthis 来引用该参数是错误的。 (如果您想混淆问题,可以在另一个范围内声明一个名为 addthis 的变量。)

孤立地,没有任何称为 answer 或称为 addthis 的东西可以被模块的客户端 used 和像变量一样操作。

考虑在模块之间传递数据可能也没有帮助。如果一个程序使用两个模块,那么它可以访问任一模块中定义的任何实体,并且可以使用,比如说,一个模块中定义的变量作为另一个模块中定义的例程的参数。模块A到use模块B也是可以的;然后 (a) B 中的代码可以操作 A 中的实体 use-associated 和 (b) uses B 也可以(传递地)访问 A 中的实体的任何其他模块(或程序)。