gpt4 book ai didi

oop - 在 Fortran 中调用派生类型数组的类型绑定(bind)过程

转载 作者:行者123 更新时间:2023-12-04 16:10:14 26 4
gpt4 key购买 nike

假设我有一个派生类型 Coordinates 及其类型绑定(bind)过程 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_ACoordinates 实例,并且我想为它调用类型绑定(bind)过程 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.

问题:如何一次为派生类型的所有实例调用类型绑定(bind)过程?我不想将调用置于循环中,但我想按照我之前编写的方式执行此操作,就像我们在 Fortran 中对数组所做的那样。

我阅读了有关 ELEMENTAL 关键字的内容,但如果我想使用它,我需要类型绑定(bind)过程是“纯”的,而我的情况并非如此。我试图在单词 procedure 之后放置一个 DEFERRED 关键字,但随后编译器说:

Error: Interface must be specified for DEFERRED binding

我为 swap 创建了一个接口(interface),但我不知道该放在哪里。我尝试了很多位置,编译器说“那里的界面出乎意料”。此外,我阅读了有关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

关于oop - 在 Fortran 中调用派生类型数组的类型绑定(bind)过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43592606/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com