Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 类型组件的指针或可分配指针_Pointers_Fortran_Dynamic Memory Allocation_Intel Fortran - Fatal编程技术网

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或1
rnd
类型。

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

派生类型的组件具有相同的属性

然而,关于组件还有其他方面的兴趣:

  • :在取消分配派生类型对象时,将取消分配任何已分配的可分配组件;指针组件不会自动解除分配或解除关联

  • :指针组件和可分配组件可能属于正在定义的类型(此处为
    dat1
    )或稍后定义的类型,但对于可分配组件而言,这是Fortran 2008之前不可用的功能,编译器不大量支持

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

我考虑在运行时检查rnd是否已分配,或者它是否与指针相关联

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

因此,您可能需要设置指针组件的初始关联状态


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