我有以下派生类型:
type datetime
integer :: year
integer :: month
integer :: day
integer :: hour
integer :: minute
end type我用这种类型定义了两个变量:
type(datetime) :: session_end
type(datetime) :: session_cursor我试图比较这两个变量,看看派生类型元素是否具有相同的值。
do while (session_cursor /= session_end)
...
end do但我明白:
do while (session_cursor /= session_end)
1
Error: Operands of comparison operator '/=' at (1) are TYPE(datetime)/TYPE(datetime)我在FreeBSD 12 64位下使用gfortran (FreeBSD)
发布于 2019-09-09 02:47:59
我使用gfortran进行了检查,得到了相同的错误消息。如果对日期时间的各个变量进行比较,代码就会工作。可能您必须使用重载,因为没有为您的类型定义比较。检查下面的示例,了解如何重载我找到的info/overload.html
发布于 2019-11-25 17:20:25
当涉及操作时,例如这里需要的比较操作,有两种不同的类型:内部操作和定义的操作。
内部操作是编译器‘默认情况下知道’的操作,定义的操作是由正在编译/使用的代码提供的操作。
仅为内部类型提供内部比较操作。对于内部一元运算符(例如一元减去-),操作数必须是内在类型的;对于内禀二进制运算符,两个操作数必须是内在类型的。
即使对于相等和不平等,也必须对派生类型使用定义的操作。问题的错误信息是,编译器不知道/无法访问此类已定义的操作。其他编译器可能会给出如下消息
错误#6355:此二进制操作对此数据类型无效。
或
操作符是派生类型的。
或
1511-026 (S)型操作数不允许进行比较操作。
因为没有定义的操作可用,所以编译器可以将派生类型视为内部操作的操作数--这是不允许的。
为了提供一个定义的操作,我们首先提供一个函数。这个函数返回一个真/假值是有意义的,它采用这种派生类型的两个操作数,而不是修改它们:
logical function datetime_unequal(lhs, rhs)
class(datetime), intent(in) :: lhs, rhs
datetime_unequal = ... ! Implement inequality test
end function datetime_unequal我们可以以明显的方式(而不是作为操作符)使用这个函数:
do while (datetime_unequal(session_cursor, session_end)))
...
end do这可能足以满足许多目的,但我们可以继续我们的方法进行一个明确的比较操作。(为了保持一致性,我们将调用运算符/=。)我们通过提供泛型接口或泛型绑定重载operator(/=)来做到这一点。
考虑一下
module datetime_mod
implicit none
type datetime
...
contains
procedure datetime_unequal
! A generic binding
generic :: operator(/=) => datetime_unequal
end type
! A generic interface
interface operator(/=)
module procedure datetime_unequal
end interface
contains
logical function datetime_unequal(lhs, rhs)
class(datetime), intent(in) :: lhs, rhs
datetime_unequal = ... ! Implement inequality test
end function datetime_unequal
end module datetime_mod注意,您不需要同时提供泛型接口和泛型绑定。实际上,在大多数情况下,泛型绑定(在类型定义中定义)更可取:只要类型定义本身是可访问的,就可以访问它;泛型接口具有独立的可访问性。
还请注意,比较函数的参数是多态的(class(datetime)),允许将其用作类型绑定过程。有了独立的功能,这就没有必要了。
最后,本讨论的大部分内容都适用于更一般的(二进制)操作,而不仅仅是那些重载内在操作的操作。
https://stackoverflow.com/questions/57846540
复制相似问题