繁体   English   中英

指针或可分配类型组件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM