5

我有一个用户定义的类型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.

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

4

2 回答 2

5

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

但是,您可以给该类型的真实实例提供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
于 2010-10-18T10:33:56.493 回答
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(:).

于 2010-10-16T12:24:58.190 回答