Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 使用重载运算符打包_Fortran - Fatal编程技术网

Fortran 使用重载运算符打包

Fortran 使用重载运算符打包,fortran,Fortran,我试图在自定义类型的数组上使用pack函数。我已经设置了一个小模块,其类型和接口可以重载.eq.。如果我做一个简单的比较,重载操作符似乎可以工作,但是当在pack函数的上下文中使用时,我会得到一个错误 !The module module m_types type :: t_property character(12) :: key logical :: value end type t_property type(t_property), allocata

我试图在自定义类型的数组上使用pack函数。我已经设置了一个小模块,其类型和接口可以重载
.eq.
。如果我做一个简单的比较,重载操作符似乎可以工作,但是当在pack函数的上下文中使用时,我会得到一个错误

!The module

module m_types

  type :: t_property
     character(12) :: key
     logical :: value
  end type t_property

  type(t_property), allocatable, dimension(:) :: properties

  public :: operator(.eq.)
  interface operator(.eq.)
     procedure prop_eq
  end interface operator(.eq.)

contains

  pure function prop_eq(first, second) result(res)
    type(t_property), intent(in) :: first, second
    logical :: res

    if (first%key .eq. second%key) then
       res = .true.
    else
       res = .false.
    end if

  end function prop_eq

end module m_types

! The test program
program textadventure
  use m_types
  implicit none
  type(t_property) :: temp

    allocate(properties(0))

    temp = t_property(key="lit", value=.true.)
    properties = [properties, temp]

    temp = t_property(key="visited", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="lit", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="cold", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="cold", value=.false.)
    properties = [properties, temp]

    print *, properties
    print *,  (properties(4) .eq. temp) ! Succeeds

    print *, size(pack(properties, properties .eq. temp)) ! Fails

    deallocate(properties)

end program textadventure
GCC错误消息

Error: Operands of comparison operator ‘.eq.’ at (1) are TYPE(t_property)/TYPE(t_property)

规范说,
PACK
中的掩码应该是我认为我提供的逻辑标量-有人能指出我错在哪里吗?

在掩码的比较中,
properties.eq。temp
您有两个
类型(t\u属性)
的对象,您希望使用函数
prop\u eq
来提供定义的操作

但是,第一个操作数
properties
是一个数组,
prop_eq
的第一个伪参数是一个标量。因此,没有定义的运算符
.eq.
可用。您应该提供一个函数来处理数组的第一个参数。一种方法是将
prop_eq
元素化

.eq.
返回数组结果是合适的:到
PACK
mask=
参数应该与数组参数一致(并且您不希望它是标量)


在成功比较
properties(4)中。temp
第一个操作数是标量。

为感兴趣的人更正了代码,它现在按预期打包

module m_types

  type :: t_property
     character(12) :: key
     logical :: value
  end type t_property

  type(t_property), allocatable, dimension(:) :: properties

  public :: operator(.eq.)
  interface operator(.eq.)
     procedure prop_eq
  end interface operator(.eq.)

contains

  function prop_eq(first, second) result(res)
    type(t_property), intent(in) :: second
    type(t_property), intent(in), dimension(:) :: first
    logical, dimension(:), allocatable :: res
    integer :: i

    allocate(res(0))
    do i=1, size(first)
       if (first(i)%key .eq. second%key) then
          res = [res, .true.]
       else
          res = [res, .false.]
       end if
    end do

  end function prop_eq

end module m_types

program textadventure
  use m_types
  implicit none
  type(t_property) :: temp

    allocate(properties(0))

    temp = t_property(key="cold", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="lit", value=.true.)
    properties = [properties, temp]

    temp = t_property(key="visited", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="lit", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="cold", value=.false.)
    properties = [properties, temp]

    temp = t_property(key="cold", value=.false.)
    properties = [properties, temp]

    print *, size(properties)
    print *,
    print *, pack(properties, mask = properties .eq. temp)

    deallocate(properties)

end program textadventure

谢谢-我修改了函数以返回一个数组,它按照预期工作。