【问题标题】:What is the difference between declaring variables within the derived type vs. within subroutine in Fortran?在派生类型中声明变量与在 Fortran 子例程中声明变量有什么区别?
【发布时间】:2019-07-15 14:51:47
【问题描述】:

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

【问题讨论】:

  • 对所有 Fortran 问题使用标签 fortran。请注意,您的代码不是 Fortran 90,但至少是 Fortran 2003。

标签: oop module fortran derived-types


【解决方案1】:

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

模块实体在包含use 语句的任何范围内都可用;在本例中为use mathstuffmodule

一个范围内能够操作在另一个范围内定义的实体的业务称为use-association,这完全是通过巧妙地使用use将实体关联到(可能是复杂而冗长的)程序中声明。

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

为了简单起见,在这个阶段只考虑程序使用模块。如果程序包含use 语句,那么只要任何程序实体在范围内,任何模块实体都在范围内。程序实体(以及与程序相关联的实体)通常在整个程序执行的范围内,但可能在子范围内被屏蔽。

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

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

单独来看,没有任何东西叫做answer,也没有任何东西叫做addthis,它可以被模块的客户端used 像变量一样操作。

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

【讨论】:

  • 似乎我对模块工作原理的基本理解已经偏离,这可能是这个问题有点令人困惑的原因。谢谢你的澄清!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2012-07-15
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
相关资源
最近更新 更多