2

我已经声明了一个递归类型:

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) 处的传递对象虚拟参数不能是指针”

如果我删除指针属性,替换为目标属性(或什么都没有),我将无法使用关联的构造。gfortran 也不会让我测试与 null() 的等价性。

问题:如何测试实际参数是否为空?

4

1 回答 1

3

你不能,反正不是这样。请参阅 F2008 的 4.5.4.5 中描述的传递对象虚拟参数的特征。此外,如果用于引用过程的对象(object%IsNull() 中的对象)未关联,那么您的程序可能无论如何都会爆炸(您违反了 F2008 12.5.1p2)。

你真的需要 IsNull 过程来进行类型绑定吗?您可以只使用“常规”程序吗?

于 2012-10-06T01:42:33.367 回答