Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Interface 派生数据类型中的Fortran赋值运算符接口_Interface_Fortran_Assignment Operator_Derived Types - Fatal编程技术网

Interface 派生数据类型中的Fortran赋值运算符接口

Interface 派生数据类型中的Fortran赋值运算符接口,interface,fortran,assignment-operator,derived-types,Interface,Fortran,Assignment Operator,Derived Types,我有以下代码: Module Hello Implicit None Type, Public :: TestOne Private Integer :: One, Two, Three contains Procedure, Pass, Public :: Set => SetSub End type TestOne Private :: SetSub Interface Assign

我有以下代码:

    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%1”、“TSTest%2”或“TSTest%3”。如果“一”、“二”和“三”不是私人的,那就微不足道了。但是,目标是保持它们的私有性,并通过接口分配访问它们。用于访问“2”或“3”的任何附加模块过程都将具有相同的伪参数,从而导致编译时错误

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

任何建议


谢谢

您定义的作业例程的开销与“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()
如果我当时觉得很有创意,我还可以为一元“access”运算符向类型添加一些泛型类型绑定:

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

b = .TheOneOutOf. TSTTest
尽管有时候这种创造性让我对编译器供应商的支持渠道过于熟悉


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

您定义的赋值例程与“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()
如果我当时觉得很有创意,我还可以为一元“access”运算符向类型添加一些泛型类型绑定:

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

b = .TheOneOutOf. TSTTest
尽管有时候这种创造性让我对编译器供应商的支持渠道过于熟悉

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