pointers - 指针或可分配类型组件

标签 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 是否已分配或者指针是否会关联。

最佳答案

派生类型的组件具有相同的 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/

相关文章:

arrays - 将字符串拆分为数组中的单词,而不使用 C 中的任何预制函数

C - 如何修改函数内部的指针数组

c++ - 对指向自定义对象的指针的 QVector 进行排序

Fortran(重新)分配分配和 gfortran 警告

c - Lapack 在 C 中设置内部 FORTRAN 参数

c++ - 正确删除 3D 矩阵的指针

c - 如何使动态分配的内存成为全局可访问的?

c - 如何在 while 循环内重新分配 *char[] ?

fortran - 在 Fortran90 中从文本文件中跳过一行

c++ - 动态分配将数据存储在堆中的随机位置?