假设我的派生类型Coordinates
及其类型绑定过程swap
:
module myTypes
implicit none
public :: Coordinates
type Coordinates
real :: x,y
contains
procedure :: swap ! Error here
end type
contains
subroutine swap(this)
class (Coordinates) :: this
this%x = this%x + this%y
this%y = -(this%y - this%x)
this%x = this%x - this%y
end subroutine
end module
现在,如果我有一个名为Coordinates
的{{1}}实例,并且我想为它调用类型绑定过程point_A
,我只会写:{{1 }}。但是,如果我有swap
的实例数组,例如:
call point_A%swap
然后为Coordinates
的所有元素调用type(Coordinates), dimension(:), allocatable :: setOfPoints
,我想写一下:
swap
为了实现这一点,我将setOfPoints
过程的代码更改为:
call setOfPoints(:)%swap
不幸的是,gfortran并不喜欢我的想法。在我在第一段代码中标记的行上,它说:
swap
问题:如何一次为派生类型的所有实例调用类型绑定过程?我不想把这个调用放在循环中,但我想在之前编写它,就像我们在Fortran中使用数组一样。
我读到了subroutine swap(these)
class (Coordinates), dimension(:) :: these
integer :: i
do i = 1, size(this)
this(i)%x = this(i)%x + this(i)%y
this(i)%y = -(this(i)%y - this(i)%x)
this(i)%x = this(i)%x - this(i)%y
end do
end subroutine
关键字,但是如果我想使用它,我需要类型绑定的程序是纯粹的',这不是我的情况。
我尝试在单词Error: Passed-object dummy argument of 'swap' must be scalar.
后放置ELEMENTAL
关键字,但编译器说:
DEFERRED
我为procedure
创建了一个界面,但我无法确定放置它的位置。我尝试了很多职位,而且编译器说那个界面出乎意料的那样'。
另外,我读到了Error: Interface must be specified for DEFERRED binding
,但我认为它对我的情况没有帮助。
答案 0 :(得分:2)
您的具体示例与ELEMENTAL
完全吻合module myTypes
implicit none
public :: Coordinates
type Coordinates
real :: x,y
contains
procedure :: swap ! Error here
end type
contains
elemental subroutine swap(this)
class (Coordinates), intent(inout) :: this
this%x = this%x + this%y
this%y = -(this%y - this%x)
this%x = this%x - this%y
end subroutine
end module
use myTypes
type(Coordinates) :: arr(10)
arr = Coordinates(1.,2.)
call arr%swap
end
你的子程序是纯粹的。如果不能,请考虑使用impure elemental
。