Проверка нулевого аргумента в Fortran 2003

Я объявил рекурсивный тип:

type treeNode
private
  class(treeNode), pointer  :: left     => null()
  class(treeNode), pointer  :: right    => null()
contains 
 procedure, non_overridable    :: IsNull           ! Returns true if link is null
end type treeNode

Теперь я хочу реализовать функцию «IsNull».

! ----
pure function IsNull( theNode )
  logical(LGT)  :: IsNull
  class(treeNode), pointer, intent(IN)  :: theNode

  IsNull = .not. associated( theNode )

end function IsNull

Gfortran жалуется на атрибут указателя: «Ошибка: фиктивный аргумент переданного объекта «isnull» в (1) не должен быть POINTER»

Если я удалю атрибут указателя, заменив его целевым атрибутом (или ничем), я не смогу использовать связанную конструкцию. Также gfortran не позволит мне проверить эквивалентность null().

Вопрос: Как я могу проверить, что фактический аргумент был нулевым?


person Richard Lozes    schedule 06.10.2012    source источник


Ответы (1)


Вы не можете, во всяком случае, не так. См. характеристики фиктивного аргумента переданного объекта, описанные в 4.5.4.5 F2008. Кроме того, если объект, используемый для ссылки на процедуру (объект в object%IsNull()), не связан, то ваша программа, вероятно, все равно взорвется (вы нарушаете F2008 12.5.1p2).

Вам действительно нужно, чтобы процедура IsNull была привязана к типу? Можете ли вы просто использовать «традиционную» процедуру?

person IanH    schedule 06.10.2012
comment
Спасибо. Насколько я понимаю спецификацию, я мог бы применить целевой атрибут и переместить нулевой тест вызывающему объекту. Обратите внимание, что я хочу сохранить указатели в типе как частные. Поэтому мою реализацию придется полностью переработать, чтобы в качестве аргументов не передавались нулевые цели. - person Richard Lozes; 06.10.2012