вызов процедуры, связанной с типом, в процедуре PURE Fortran - PullRequest
3 голосов
/ 07 марта 2019

Если я объявил тип как

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

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

, моя подпрограмма proc будет PURE.Мой 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 

Я получаю ошибку на 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`

1 Ответ

2 голосов
/ 07 марта 2019

Ваша проблема связана с звонком

call test1% dum_proc(nk)

Поскольку test1 в чистой подпрограмме caller было связано с использованием, нельзя использовать фактический аргумент, соответствующий фиктивному аргументу с атрибутом intent(inout). При вызове связанной с типом процедуры test1 означает , связанный с фиктивным аргументом переданного объекта this (с этим намерением).

Связывание с фиктивным аргументом intent(inout) считается контекстом определения переменной, и именно это означает «определение» контекста в сообщении об ошибке. Для фактического изменения аргумента необязательно, чтобы он находился в определяющем контексте.

Если вместо этого у вас есть test1 в качестве фиктивного аргумента intent(inout), это ограничение не применяется. * test1 связанный * хост имеет такое же ограничение, как если бы ассоциировано использование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...