假设您有一个声明的类型 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 是否已分配或者指针是否会关联。
最佳答案
派生类型的组件具有相同的 concerns as general pointer/allocatable variables .
但是,关于组件还有其他方面值得关注:
automatic deallocation :在释放派生类型对象时,任何已分配的可分配组件都会被释放;指针组件不会自动释放或解除关联。
type references :指针和可分配组件都可以是正在定义的类型(此处为
dat1
)或稍后定义的类型,但对于可分配组件,这是 Fortran 2008 之前不可用的功能,并且不受 Fortran 2008 的大规模支持编译器。
链接问题的答案中未提及的一个差异与此问题相关。在这里你说:
I was considering during runtime that I would check if rnd was allocated or for pointer it would be associated
总是允许询问ALLOCATED(x%rnd)
(可分配),但并不总是允许询问ASSOCIATED(x%rnd)
(指针) 。指针组件可能具有未定义的关联状态,而可分配组件将始终具有已定义的分配状态。1
因此,您可能想要设置指针组件的初始关联状态。
1未定义分配状态(Fortran 90)和可分配组件的情况在标准中从未共存。
关于pointers - 指针或可分配类型组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54213020/