在 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 与使用关联具有相同的限制。
如果我已经声明类型
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 与使用关联具有相同的限制。