我可以指向可分配数组组件中的项吗?

时间:2010-10-16 08:52:32

标签: fortran fortran90

我有一个用户定义的类型vector。在另一种类型中,我有一个可分配的向量数组。我想要一个指向这个可分配数组中的单个向量的指针。所以我想我会这样做:

type another_type
  type(vector),allocatable,target::my_vectors(:)
end type

type(vector),pointer::pointed_vec

但是当我编译时,编译器抱怨:

This attribute specification is not valid for a component definition statement.

我可以指向可分配数组中的单个项吗?有可能吗?

2 个答案:

答案 0 :(得分:5)

只有变量或派生类型的实际实例可能具有TARGET属性。因此,第二种类型定义中的allocatable不能是目标,因为这只是对类型应该是什么样的描述,如果你愿意的话就是模板。

但是,您可以为TARGET属性提供类型的真实实例,然后使用适当声明的Fortran指针指向其中任何组件部分。

编辑:另一种选择,也就是你所追求的更多内容,只是将矢量数组赋予POINTER属性类型,这隐含地使它成为合法的指针和可用于分配内存。你必须确保在用它来分配内存之后不要重新分配指针(在下面的例子中为v),因为那样你就会有泄漏。

PROGRAM so_pointtype

  IMPLICIT NONE

  TYPE vec
    INTEGER :: x = 2, y = 3
  END TYPE vec

  TYPE foo
    TYPE(vec),POINTER :: v(:)
  END TYPE foo

  TYPE(foo) :: z
  TYPE(vec),DIMENSION(:),POINTER :: p2 => NULL()

  ALLOCATE(z%v(3))

  PRINT*,z%v(:)

  p2 => z%v(:)

  PRINT*,p2

END PROGRAM so_pointtype

答案 1 :(得分:0)

是的,您可以指向可分配数组中的单个项目,但您的数组my_vectors是标量,不能具有allocatable属性。也许正是这个声明给出了编译器错误。使用gfortran我得到一个编译时消息:

  TYPE(vector),ALLOCATABLE,TARGET :: my_vectors
                                1
Error: Scalar object 'my_vectors' at (1) may not be ALLOCATABLE

尝试声明为my_vectors(:)