Чтобы переправить связанный список в Fortran, я использую указатель на текущий элемент, который перемещается в следующий внутри цикла. Попытка применить это внутри функции pure
, которая работает с указанным связанным списком, приводит к ошибке.Указатели в чистых функциях
Пример:
module list
implicit none
! Node
type n_list
integer :: val
type(n_list),pointer :: next => NULL()
end type
! Linked list
type t_list
type(n_list),pointer :: head
end type
contains
pure function in_list(list, val) result(res)
implicit none
class(t_list),intent(in) :: list
integer,intent(in) :: val
logical :: res
type(n_list),pointer :: cur
res = .true.
! Traverse the list
cur => list%head
do while (associated(cur))
if (cur%val == val) return
cur => cur%next
enddo
! Not found
res = .false.
end function
end module
Результаты в
cur => list%head
1
Error: Bad target in pointer assignment in PURE procedure at (1)
Я отдаю себе отчет в обоснование за ошибки/предупреждения, и что трудно гарантировать, что аргументы функции не изменяются при использовании указателей (Fortran 2008, глава 12.7 «Чистые процедуры», например, C1283). В этом случае, однако, list
никогда не изменяется.
Можно ли сообщить компилятору (ifort
и gfortran
), что intent(in)
не нарушен?
Вы имеете в виду C1283? – francescalus
Да, конечно ... Я скопировал неправильную строку ;-) Спасибо! –
Я понятия не имею о ответе, но если я думаю «нет», не могли бы вы лежать с блоком интерфейса? – francescalus