gpt4 book ai didi

fortran - 在 PURE 过程 Fortran 中调用类型绑定(bind)过程

转载 作者:行者123 更新时间:2023-12-02 14:34:27 29 4
gpt4 key购买 nike

如果我声明了类似的类型

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

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

我的proc子例程是纯粹的。我的过程返回一个值并且没有任何副作用。

 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

我在调用 test% proc(n) 时收到错误,内容如下:

错误 #7140:此全局使用关联对象出现在 PURE 过程的“定义”上下文中或 PURE 过程中包含的内部过程中。

一个独立的示例

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)

因为纯子例程caller中的test1已被使用关联,所以不允许是与具有intent(inout ) 属性。在对类型绑定(bind)过程 test1 的调用中, 与传递的对象虚拟参数 this 关联(具有该意图)。

intent(inout) 虚拟参数关联算作变量定义上下文,这就是错误消息中“'defining' context”的含义。实际上,不必更改参数即可使其处于定义上下文中。

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

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

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