在 Fortran 中调用派生类型数组的类型绑定过程
Calling type-bound procedure for an array of derrived types in Fortran
假设我有一个派生类型 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
现在,如果我有一个名为 point_A
的 Coordinates
实例,如果我想为它调用类型绑定过程 swap
,我会这样写:call point_A%swap
。但是如果我有一个 Coordinates
的实例数组,比如:
type(Coordinates), dimension(:), allocatable :: setOfPoints
然后为 setOfPoints
的所有元素调用 swap
,我想写:
call setOfPoints(:)%swap
为了实现这一点,我将 swap
程序的代码更改为:
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
不幸的是,gfortran 不喜欢我的想法。在我在第一段代码中标记的行上写着:
Error: Passed-object dummy argument of 'swap' must be scalar.
问题:如何一次为派生类型的所有实例调用类型绑定过程?我不想将调用置于循环中,但我想按照我之前写的那样执行此操作,就像我们在 Fortran 中对数组所做的那样。
我读到了 ELEMENTAL
关键字,但如果我想使用它,我需要类型绑定过程是 'pure',我的情况不是这样。
我试图在单词 procedure
之后放置一个 DEFERRED
关键字,但是编译器说:
Error: Interface must be specified for DEFERRED binding
我为 swap
创建了一个界面,但我不知道该放在哪里。我尝试了很多位置,编译器说 'interface was unexpected there'。
另外,我读到了 SELECT TYPE
,但我认为这对我的情况没有帮助。
您的具体示例非常适合 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
.
假设我有一个派生类型 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
现在,如果我有一个名为 point_A
的 Coordinates
实例,如果我想为它调用类型绑定过程 swap
,我会这样写:call point_A%swap
。但是如果我有一个 Coordinates
的实例数组,比如:
type(Coordinates), dimension(:), allocatable :: setOfPoints
然后为 setOfPoints
的所有元素调用 swap
,我想写:
call setOfPoints(:)%swap
为了实现这一点,我将 swap
程序的代码更改为:
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
不幸的是,gfortran 不喜欢我的想法。在我在第一段代码中标记的行上写着:
Error: Passed-object dummy argument of 'swap' must be scalar.
问题:如何一次为派生类型的所有实例调用类型绑定过程?我不想将调用置于循环中,但我想按照我之前写的那样执行此操作,就像我们在 Fortran 中对数组所做的那样。
我读到了 ELEMENTAL
关键字,但如果我想使用它,我需要类型绑定过程是 'pure',我的情况不是这样。
我试图在单词 procedure
之后放置一个 DEFERRED
关键字,但是编译器说:
Error: Interface must be specified for DEFERRED binding
我为 swap
创建了一个界面,但我不知道该放在哪里。我尝试了很多位置,编译器说 'interface was unexpected there'。
另外,我读到了 SELECT TYPE
,但我认为这对我的情况没有帮助。
您的具体示例非常适合 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
.