类型组件的指针或可分配指针

时间:2019-01-16 08:34:01

标签: pointers fortran dynamic-memory-allocation intel-fortran

假设您有一个声明的类型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是否已分配或是否与指针关联。

1 个答案:

答案 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)和可分配组件的情况。