我有一个用户定义的类型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.
我可以指向可分配数组中的单个项吗?有可能吗?
答案 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(:)
。