在 PURE 过程 Fortran 中调用类型绑定过程

calling a type bound procedure in a PURE procedure Fortran

如果我已经声明类型

 type test(NSIZE)
  integer, len :: NSIZE
  real :: dummy(NSIZE)
  contains 
  procedure, pass(this) :: proc 

  end test
  type(test(NSIZE=10)) :: test_type

我的 proc 子例程是纯粹的。我的程序 returns 说一个值,没有任何副作用。

 pure subroutine proc(this, n) 
  implicit none 
 class(test(NSIZE=*)), intent(inout) :: this 
 integer, intent(inout) :: n
    n = n +1 
 end subroutine proc

现在在另一个也声明为 PURE 的子程序中我调用 proc

  pure subroutine test2 

    integer :: n 

     call  test_type% proc(n)
  end subroutine test2 

我在 call test% proc(n) 上收到以下错误消息:

error #7140: This global use associated object appears in a 'defining' context in a PURE procedure or in an internal procedure contained in a PURE procedure.

一个独立的例子

module mod1
   implicit none

      type test (size)
         integer, len :: size
         real :: dum(size)
      contains
         procedure, pass(this) :: dum_proc
      end type

      type(test(size=10)) :: test1

   contains

      pure subroutine dum_proc(this,  n )
         implicit none
         class(test(size=*)), intent(inout) :: this
         integer, intent(out) :: n
         n =n +2
      end subroutine dum_proc
end module mod1


program SUPPORT


implicit none
integer :: n

n = 0

call caller(n)


contains
   pure subroutine caller( nk )
   use mod1, only : test1
   implicit none

   integer, intent(inout) :: nk

   call test1% dum_proc(nk)

   end subroutine

end program SUPPORT`

您的问题来自电话

call test1% dum_proc(nk)

因为test1在纯子程序caller中已经被关联使用,所以它不允许是对应于具有intent(inout)属性的伪参数的实际参数。在对类型绑定过程的调用中 test1 与传递的对象伪参数 this (具有该意图)相关联。

intent(inout) 虚拟参数相关联算作变量定义上下文,这就是错误消息中“'defining' 上下文”的意思。没有必要实际更改参数以使其处于定义上下文中。

如果您将 test1 作为 intent(inout) 虚拟参数,则此限制不适用。关联 test1 host 与使用关联具有相同的限制。