Я работаю над модулем, который выглядит примерно так:
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()
головной узел связанного списка должен обрабатываться немного иначе, чем любой из других узлов. У меня проблемы с выяснением того, как подпрограмма может определить, имеет ли она дело с головным узлом. В коде, который я вставил в два подхода, которые я попробовал, наряду с ошибками компиляции, которые они дают.
Я могу отличить головной узел по тому факту, что если код выполняется правильно, это будет единственный узел, родительский элемент которого не связан. Но, возможно, кто-то собирается прийти позже и попытаться использовать код, например, таким образом, который требует циклически связанный список, и тогда родительский критерий не будет работать. В любом случае, мне кажется, предпочтительнее найти какой-либо способ обнаружения головного узла, основанный просто на его собственном существовании в памяти, помимо значений любого из его элементов. Есть ли способ сделать это?