Различение головного узла и других узлов в процедуре производного типа - PullRequest
0 голосов
/ 02 января 2019

Я работаю над модулем, который выглядит примерно так:

module linked_elems

type link
  integer :: i
  double precision :: a
  type(link), pointer :: parent=>null()
  type(link), pointer :: child=>null()
contains
  procedure forward_op
  ! and all the usual linked list stuff
end type

type(link), target :: head

contains

subroutine forward_op(ln)

class(link), target :: ln

! do stuff to ln%i and ln%a

! if ln == head do extra stuff to ln%i and ln%a

!Operands of comparison operator '==' at (1) are CLASS(link)/TYPE(link)V
!if (ln == head) then  
!  print *,'ln is head'
!endif

!Error: ‘pointer’ argument of ‘associated’ intrinsic at (1) must be a POINTER
!if (associated(ln, head)) then  
!  print *, 'ln is head'
!endif

end subroutine

end module

Реальный модуль намного сложнее, но это иллюстрирует проблему, с которой я столкнулся. В subroutine forward_op() головной узел связанного списка должен обрабатываться немного иначе, чем любой из других узлов. У меня проблемы с выяснением того, как подпрограмма может определить, имеет ли она дело с головным узлом. В коде, который я вставил в два подхода, которые я попробовал, наряду с ошибками компиляции, которые они дают.

Я могу отличить головной узел по тому факту, что если код выполняется правильно, это будет единственный узел, родительский элемент которого не связан. Но, возможно, кто-то собирается прийти позже и попытаться использовать код, например, таким образом, который требует циклически связанный список, и тогда родительский критерий не будет работать. В любом случае, мне кажется, предпочтительнее найти какой-либо способ обнаружения головного узла, основанный просто на его собственном существовании в памяти, помимо значений любого из его элементов. Есть ли способ сделать это?

...