Fortran 派生类型运算符
Posted
技术标签:
【中文标题】Fortran 派生类型运算符【英文标题】:Fortran Derived Type Operators 【发布时间】:2016-10-04 04:12:56 【问题描述】:我有点困惑,因为我正在运行我的代码以使用 u = v * scalar 和 v = scalar * u 进行标量向量乘法
我认为下面的代码会给我模棱两可的声明 通用的“*”。 vsm_real32、vsm_real64 和 vsm_real128 和函数 svm 不冲突?
Procedure :: vsm_real32, vsm_real64, &
vsm_real128
Procedure, Pass (tb) :: svm
Generic :: Operator (*) => vsm_real32, &
vsm_real64, vsm_real128, &
svm
Contains
Function vsm_real32 (tb, sc_real32) Result (ta)
Type (Vector) :: ta
Class (Vector), Intent (In) :: tb
Real (Real32), Intent (In) :: sc_real32
Call vsmd (ta, tb, sc_real32, "*")
End Function vsm_real32
Function vsm_real64 (tb, sc_real64) Result (ta)
Type (Vector) :: ta
Class (Vector), Intent (In) :: tb
Real (Real64), Intent (In) :: sc_real64
Call vsmd (ta, tb, sc_real64, "*")
End Function vsm_real64
Function vsm_real128 (tb, sc_real128) Result (ta)
Type (Vector) :: ta
Class (Vector), Intent (In) :: tb
Real (Real128), Intent (In) :: sc_real128
Call vsmd (ta, tb, sc_real128, "*")
End Function vsm_real128
Function svm (sc, tb) Result (ta)
Type (Vector) :: ta
Class (*), Intent (In) :: sc
Class (Vector), Intent (In) :: tb
Call vsmd (ta, tb, sc, "*")
End Function svm
【问题讨论】:
【参考方案1】:通用绑定用于操作员。可区分过程的要求仅基于虚拟参数的位置。
(对于表达式a * b
,第一个虚拟参数始终对应a
,第二个对应b
。在这种情况下,传递的参数不会影响消歧。)
vsm_*
函数都有一个必需的第二个虚拟参数,该参数因函数而异。因此,第二个参数是可区分的,因此 vsm_*
函数都是可区分的。
svm 函数的第二个参数是Vector
类型。这是与 vsm_*
函数 (REAL) 的第二个参数的类型不同的类型,因此第二个参数是可区分的,因此 svm
函数可与所有 vsm_*
函数区分开来。
参考 F2008 C1212。
【讨论】:
以上是关于Fortran 派生类型运算符的主要内容,如果未能解决你的问题,请参考以下文章