【问题标题】:Fortran Assignment operator Interface in derived data type派生数据类型中的 Fortran 赋值运算符接口
【发布时间】:2013-10-02 01:43:21
【问题描述】:

我有以下代码:

    Module Hello
      Implicit None
    Type, Public :: TestOne
       Private
       Integer :: One, Two, Three
     contains
       Procedure, Pass, Public :: Set => SetSub
    End type TestOne
    Private :: SetSub
    Interface Assignment(=)
       Module Procedure SubgetValue
    End Interface Assignment(=)
    contains
      Subroutine SetSub(this)
        Implicit none
        Class(TestOne), Intent(InOut) :: this
        this%one=1
        this%two=2
        this%three=3
      End Subroutine SetSub
      Subroutine SubGetValue(ISOut,TSIn)
        Implicit None
        Integer, Intent(Out) :: ISOut
        Class(TestOne), Intent(In) :: TSIn
        ISOut=TSIn%one
      End Subroutine SubGetValue
    End Module Hello
    Program Test
      use Hello
      Implicit None
      Type(TestOne) :: TSTest
      Integer :: b
      call TSTest%Set()
      b=TSTest
      write(*,*) b
    End Program Test

在这个版本中,我只能通过“=”访问“TSTest%One”。 问题是如何创建一个接口分配,以便我可以访问“TSTest%one”、“TSTest%two”或“TSTest%three”。如果“一”、“二”和“三”不是私有的,那将是微不足道的。但是,目标是保持它们的私密性并通过接口分配访问它们。任何用于访问“二”或“三”的附加模块过程都将具有相同的虚拟参数,从而导致编译时错误。

但是,解决该问题的另一种方法是“setter”/“getter”例程,但我在网络上的某个地方读到,通过赋值访问 varialbe 比通过“getter”例程快得多。

任何建议。

谢谢

【问题讨论】:

    标签: interface fortran assignment-operator derived-types


    【解决方案1】:

    您定义的分配例程与“getter”具有相同的开销 - 因为它就是这样。

    如果(何时)编译器过程间优化达到标准,则不应有任何额外开销,尤其是在 TSTest 对象不是多态的情况下。

    编辑之前...

    除了通过混合类型分配提取任何明显的单一候选者之外,我更喜欢的方法是使用单独的绑定来访问每个组件。

    TYPE, PUBLIC :: TestOne
      PRIVATE
      INTEGER :: One, Two, Three
    CONTAINS
      PROCEDURE :: GetOne
      PROCEDURE :: GetTwo
      PROCEDURE :: GetThree
      ...
    
    FUNCTION GetOne(this)
      CLASS(TestOne), INTENT(IN) :: this
      INTEGER :: GetOne
      GetOne = this%One
    END FUNCTION GetOne
    ...
    
    b = TSTTest%GetTwo()
    

    如果我觉得有创意,我还可以为一元“访问”运算符添加一些通用类型绑定到类型:

    TYPE, PUBLIC :: TestOne
      PRIVATE
      INTEGER :: One, Two, Three
    CONTAINS
      PROCEDURE :: GetOne
      ...
      GENERIC :: OPERATOR(.TheOneOutOf.) => GetOne
    ...
    
    b = .TheOneOutOf. TSTTest
    

    虽然有时这种创造力只是让我对我的编译器供应商的支持渠道过于熟悉。

    (考虑绑定定义的赋值类型。)

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2016-10-04
      • 2014-10-19
      • 2011-11-13
      • 1970-01-01
      • 2012-02-12
      • 2021-07-31
      相关资源
      最近更新 更多