在Fortran中调用类型绑定的过程类型的数组绑定过程

时间:2017-04-24 15:51:23

标签: oop fortran derived-class

假设我的派生类型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 ,但我认为它对我的情况没有帮助。

1 个答案:

答案 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