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
为类型获取电源。