Pointers 类型组件的指针或可分配指针
假设您有一个声明的类型Pointers 类型组件的指针或可分配指针,pointers,fortran,dynamic-memory-allocation,intel-fortran,Pointers,Fortran,Dynamic Memory Allocation,Intel Fortran,假设您有一个声明的类型dat1,它具有默认的成员数。根据运行时的不同,此dat1可以扩展,也可以不扩展为其他类型。这很容易,因为您可以使用扩展功能。但是,如果您有一个dat1数组,并且该数组的某些元素可能希望也可能不希望继承另一种类型,那么如何最合理地实现这一点呢 我举了以下例子: type dat1 real :: x(3) type(dat2), allocatable :: rnd type(dat1), pointer :: next => dat1 end da
dat1
,它具有默认的成员数。根据运行时的不同,此dat1
可以扩展,也可以不扩展为其他类型。这很容易,因为您可以使用扩展
功能。但是,如果您有一个dat1
数组,并且该数组的某些元素可能希望也可能不希望继承另一种类型,那么如何最合理地实现这一点呢
我举了以下例子:
type dat1
real :: x(3)
type(dat2), allocatable :: rnd
type(dat1), pointer :: next => dat1
end dat1
现在我用一个链表来做这个。我的问题基本上是,将第二种类型rnd
声明为可分配类型,然后在节点请求时分配它是否正确。
另一个选项是将其声明为指针,即类型(dat2),可分配::rnd
,现在是否存在任何显著差异,尽管指针与可分配文件(如显式/隐式释放、连续内存等)存在共同的Fortran差异
请注意,无论发生什么情况,每个dat1
节点都将始终附加0或1rnd
类型。在运行时,我考虑检查
rnd
是否已分配,或者它是否与指针关联 派生类型的组件具有相同的属性
然而,关于组件还有其他方面的兴趣:
- :在取消分配派生类型对象时,将取消分配任何已分配的可分配组件;指针组件不会自动解除分配或解除关联
- :指针组件和可分配组件可能属于正在定义的类型(此处为
)或稍后定义的类型,但对于可分配组件而言,这是Fortran 2008之前不可用的功能,编译器不大量支持dat1
已分配(x%rnd)
(可分配),但不允许询问关联(x%rnd)
(指针)。指针组件可能具有未定义的关联状态,而可分配组件将始终具有已定义的分配状态。1
因此,您可能需要设置指针组件的初始关联状态
1标准中从未同时存在未定义的分配状态(Fortran 90)和可分配组件的情况