这两个代码有什么区别
type Foo
real, allocatable :: bar(:)
end type
和
type Foo
real, pointer :: bar(:)
end type
特别是在涉及以下代码时:
type(Foo) :: myfoo
allocate(myfoo%bar(10))
在那种情况下,我看不出有任何主要区别。
一般来说,ALLOCATABLE 数组更有效。但是在 Fortran 90/95 POINTER 数组中更加灵活。例如,不可能将 ALLOCATABLE 数组用作派生类型的组件。Fortran 2003 解决了这个问题。所以尽可能使用 ALLOCATABLE 数组。
编辑
只想提一下程序在尝试分配已分配实体时的行为的显着差异。如果实体是 ALLOCATABLE 你会得到运行时错误。该程序
PROGRAM main
IMPLICIT NONE
TYPE :: foo
REAL, DIMENSION(:), ALLOCATABLE :: bar
END TYPE foo
TYPE(foo) :: my_foo
ALLOCATE (my_foo%bar(10))
ALLOCATE (my_foo%bar(10))
END PROGRAM main
用 gfortran 编译会产生这样的错误信息:
Fortran runtime error: Attempting to allocate already allocated variable 'my_foo'
相反,您可以使用 POINTER 执行此类操作。