Fortran 共享同一子例程的两个派生类型

Fortran 共享同一子例程的两个派生类型,fortran,derived-types,Fortran,Derived Types,我在一个模块中有两个派生类型,Interval和inreset。两者都具有相同的功能,但一个对实数进行操作,另一个对整数进行操作 遇到的问题如下 lib/interval.f:85:11: Procedure :: eptset => inrval_set 1 Error: Argument 't' of 'inrval_set' with PASS(t) at (1) must be of the derived-type 'inrset' lib/interval

我在一个模块中有两个派生类型,
Interval
inreset
。两者都具有相同的功能,但一个对实数进行操作,另一个对整数进行操作

遇到的问题如下

lib/interval.f:85:11:

Procedure :: eptset => inrval_set
        1
Error: Argument 't' of 'inrval_set' with PASS(t) at (1) 
must be of the derived-type 'inrset'

lib/interval.f:55:11:

Procedure :: eptset => inrval_set
        1
Error: Argument 't' of 'inrval_set' with PASS(t) at (1) 
must be of the derived-type 'interval'
这是
间隔
派生类型

Type Interval

Real (Real32) :: inf, sup

Contains
  Procedure :: eptset => inrval_set

End Type Interval
Type Inrset

Integer (Int32) :: inf, sup

Contains
  Procedure :: eptset => inrval_set

End Type Inrset
这是
Intrset
派生类型

Type Interval

Real (Real32) :: inf, sup

Contains
  Procedure :: eptset => inrval_set

End Type Interval
Type Inrset

Integer (Int32) :: inf, sup

Contains
  Procedure :: eptset => inrval_set

End Type Inrset
这是设置
inf
sup
的通用子程序

Subroutine inrval_set  &
  (                    &
    t, inf, sup        &
  )

Class (*), Intent (InOut) :: t
Class (*), Intent (In) :: inf, sup

!!$--------------------------------------------------
!!$ Sets t% inf = inf;  t% sup = sup

Select Type (t)
Type Is (Interval)
  Call numtrf (t% inf, inf)
  Call numtrf (t% sup, sup)

Type Is (Inrset)
  Call numtrf (t% inf, inf)
  Call numtrf (t% sup, sup)

End Select 

End Subroutine inrval_set

诚然,错误消息并不总是有用的。在这种情况下,这是一个很好的提示

派生类型
Interval
有一个绑定名为
eptset
的类型绑定过程,其接口与过程
inrval\u set
相同。这是你的困难

我想你会想到这样一个电话

type(Interval) range
call range%eptset(1._real32, 15._real32)
这是一个合理的目标

但是,您依赖于传递的对象伪参数,因此在
inrval\u set
中,您的第一个伪参数
t
是动态类型
range
。这是有缺陷的

如错误消息所示,
Interval
中类型绑定过程的接口必须具有类型为
Interval
的伪参数,因为它没有
NOPASS
属性。
class(*)
的伪参数不是这样的东西

您不希望使用
NOPASS
执行此方法

你当然可以

call inrval_set(range, 1._real32, 15._real32)
作为一种选择。但是有没有限制类型的方法呢

你可以考虑一下。或者,有一个(抽象)父类。或者为类型绑定的过程提供适当的接口-每种类型一个接口


本质上,您正在重复
选择类型
块中的代码,因此您也可以使用通用/动态分辨率来重复代码。

您想知道为什么您试图做的是错误的,还是另一种方法来做您想做的事?我正在寻找一种可能有效的方法。我已经为每种类型的工作设置了单独的例程。这将有助于理解这段代码发生了什么,它要求我为每种情况都有单独的子程序。是否有一个好的解决方法,或者我必须重新考虑该方法?如果必须使用不同的类型,则需要两个不同的类型绑定过程,每个过程都有正确的伪参数。这就是错误所说的。如何最好地设计你的程序是另一个问题。我明白了。注意,在模板制作时,
.inc
文件中没有指定类型。您能给我解释一下
NOPASS
的想法吗?您可以在通常的参考资料中阅读有关
NOPASS
的内容。我不会在这里解释,因为这真的不是你想做的事情
nopass
只是意味着被调用的过程不会有传递的对象伪参数。但这正是您想要的,因为您想要设置该对象的值。它确实允许您执行
调用范围%eptset(range,…)
(可能),但在这一点上,您也可以调用inrval\u set(range,…)。是的。我在编码一些运算符时使用了pass,其中第一个伪参数没有被类型化为派生类型名。我向您保证,我想要一个类型绑定过程,而不是调用
inrval\u set(range,…)
。关于模板的更多信息也在这里。您将看到如何使用
#include
而不是
include
为类型获取电源。