[英]Pointer or allocatable for type components
假设您有一个声明类型dat1
,它具有默认的成员数。 根据运行时间,此dat1
可能会或可能不会扩展为其他类型。 这很容易,因为您可以使用extends
功能。 但是,如果你有一个dat1
数组, 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
已分配,或者是否与指针相关联。
派生类型的组件与一般指针/可分配变量具有相同的关注点 。
但是,有关组件的其他方面:
自动释放 :在解除分配派生类型对象时,释放任何已分配的可分配组件; 指针组件不会自动释放或取消关联。
类型引用 :指针和可分配组件都可以是定义的类型(此处为dat1
)或稍后定义,但对于可分配组件,这是Fortran 2008之前不可用的功能,并且编译器没有大量支持。
链接问题答案中未提及的一个区别与此问题相关。 在这里你说:
我正在考虑在运行时我会检查rnd是否已分配,或者是否与指针相关联
始终允许询问ALLOCATED(x%rnd)
(可分配),但并不总是允许询问ASSOCIATED(x%rnd)
(指针)。 指针组件可以是未定义的关联状态,而可分配组件将始终具有已定义的分配状态。 1
因此,您可能希望设置指针组件的初始关联状态。
1未定义的分配状态(Fortran 90)和可分配组件的情况从未在标准中共存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.