Fortran 使用重载运算符打包
我试图在自定义类型的数组上使用pack函数。我已经设置了一个小模块,其类型和接口可以重载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
.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
谢谢-我修改了函数以返回一个数组,它按照预期工作。