【问题标题】:Pointer or allocatable for type components类型组件的指针或可分配
【发布时间】:2019-06-10 07:13:30
【问题描述】:

假设你有一个声明类型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 或是否关联指针。

【问题讨论】:

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


    【解决方案1】:

    派生类型的组件具有相同的concerns as general pointer/allocatable variables

    但是,组件还有其他一些令人感兴趣的方面:​​

    • automatic deallocation:在释放派生类型对象时,任何已分配的可分配组件都将被释放;指针组件不会自动释放或解除关联。

    • type references:指针和可分配组件都可以是正在定义的类型(此处为dat1)或稍后定义,但对于可分配组件,这是 Fortran 2008 之前不可用的功能,并且是编译器没有大量支持。

    链接问题的答案中未提及的一个差异与此问题相关。在这里你说:

    我正在考虑在运行时检查 rnd 是否已分配或是否关联指针

    总是允许询问ALLOCATED(x%rnd)(可分配),但并不总是允许询问ASSOCIATED(x%rnd)(指针)。指针组件可能具有未定义的关联状态,而可分配组件将始终具有已定义的分配状态。1

    因此您可能希望设置指针组件的初始关联状态。


    1未定义分配状态(Fortran 90)和可分配组件的情况在标准中从未共存。

    【讨论】:

      猜你喜欢
      • 2016-12-17
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 1970-01-01
      • 2014-10-10
      • 2019-08-28
      • 2016-03-03
      • 1970-01-01
      相关资源
      最近更新 更多