首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用gfortran (gcc8)比较两个派生类型变量

使用gfortran (gcc8)比较两个派生类型变量
EN

Stack Overflow用户
提问于 2019-09-08 23:51:19
回答 2查看 385关注 0票数 1

我有以下派生类型:

代码语言:javascript
复制
type datetime
    integer     :: year
    integer     :: month
    integer     :: day
    integer     :: hour
    integer     :: minute
end type

我用这种类型定义了两个变量:

代码语言:javascript
复制
type(datetime)                          :: session_end
type(datetime)                          :: session_cursor

我试图比较这两个变量,看看派生类型元素是否具有相同的值。

代码语言:javascript
复制
do while (session_cursor /= session_end)
    ...
end do

但我明白:

代码语言:javascript
复制
do while (session_cursor /= session_end)
         1
Error: Operands of comparison operator '/=' at (1) are TYPE(datetime)/TYPE(datetime)

我在FreeBSD 12 64位下使用gfortran (FreeBSD)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-09-09 02:47:59

我使用gfortran进行了检查,得到了相同的错误消息。如果对日期时间的各个变量进行比较,代码就会工作。可能您必须使用重载,因为没有为您的类型定义比较。检查下面的示例,了解如何重载我找到的info/overload.html

票数 1
EN

Stack Overflow用户

发布于 2019-11-25 17:20:25

当涉及操作时,例如这里需要的比较操作,有两种不同的类型:内部操作和定义的操作。

内部操作是编译器‘默认情况下知道’的操作,定义的操作是由正在编译/使用的代码提供的操作。

仅为内部类型提供内部比较操作。对于内部一元运算符(例如一元减去-),操作数必须是内在类型的;对于内禀二进制运算符,两个操作数必须是内在类型的。

即使对于相等和不平等,也必须对派生类型使用定义的操作。问题的错误信息是,编译器不知道/无法访问此类已定义的操作。其他编译器可能会给出如下消息

错误#6355:此二进制操作对此数据类型无效。

操作符是派生类型的。

1511-026 (S)型操作数不允许进行比较操作。

因为没有定义的操作可用,所以编译器可以将派生类型视为内部操作的操作数--这是不允许的。

为了提供一个定义的操作,我们首先提供一个函数。这个函数返回一个真/假值是有意义的,它采用这种派生类型的两个操作数,而不是修改它们:

代码语言:javascript
复制
logical function datetime_unequal(lhs, rhs)
   class(datetime), intent(in) :: lhs, rhs
   datetime_unequal = ...   ! Implement inequality test
end function datetime_unequal

我们可以以明显的方式(而不是作为操作符)使用这个函数:

代码语言:javascript
复制
do while (datetime_unequal(session_cursor, session_end)))
...
end do

这可能足以满足许多目的,但我们可以继续我们的方法进行一个明确的比较操作。(为了保持一致性,我们将调用运算符/=。)我们通过提供泛型接口或泛型绑定重载operator(/=)来做到这一点。

考虑一下

代码语言:javascript
复制
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)),允许将其用作类型绑定过程。有了独立的功能,这就没有必要了。

最后,本讨论的大部分内容都适用于更一般的(二进制)操作,而不仅仅是那些重载内在操作的操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57846540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档