假设您有一个声明的类型dat1
,该类型具有默认的成员数。根据运行时间的不同,此dat1
可能会也可能不会与其他类型一起扩展。这很容易,因为您可以使用extends
功能。但是,如果您有一个dat1
数组,并且该数组中的某些元素可能会或可能不想继承其他类型-这是最合理的做法。
我有以下示例:
type dat1
real :: x(3)
type(dat2), allocatable :: rnd
type(dat1), pointer :: next => dat1
end dat1
现在,我使用链接列表执行此操作。我的问题基本上是,是否将第二种类型rnd
声明为可分配的,然后在节点请求时进行分配,才是正确的方法。
另一个选择是将其声明为指针,即type(dat2), allocatable :: rnd
,尽管有明显的区别,尽管Fortran与指针和分配表之间存在常见的区别,例如显式/隐式释放,连续内存等。
请注意,无论如何,每个dat1
节点将始终附加有0或1个rnd
类型。
我当时正在考虑在运行时检查rnd
是否已分配或是否与指针关联。
答案 0 :(得分:3)
派生类型的组件具有相同的concerns as general pointer/allocatable variables。
但是,有关组件还有其他有趣的方面:
automatic deallocation:在取消分配派生类型对象时,将释放所有已分配的可分配组件;指针组件不会自动释放或取消关联。
type references:指针和可分配组件都可以是正在定义的类型(此处为dat1
),也可以在以后定义,但是对于可分配组件,这是以前没有的功能Fortran 2008并不受编译器的广泛支持。
链接问题的答案中未提及的一个不同之处与该问题有关。在这里你说:
我正在考虑在运行时检查是否分配了rnd或将其关联的指针
始终允许询问ALLOCATED(x%rnd)
(可分配),但并不总是允许询问ASSOCIATED(x%rnd)
(指针)。指针组件可能具有未定义的关联状态,而可分配的组件将始终具有已定义的分配状态。 1
因此,您可能希望设置指针组件的初始关联状态。
1 在标准中从未存在未定义分配状态(对于Fortran 90)和可分配组件的情况。