这两个代码之间有什么区别
type Foo
real, allocatable :: bar(:)
end type
和
type Foo
real, pointer :: bar(:)
end type
特别是在涉及以下代码时:
type(Foo) :: myfoo
allocate(myfoo%bar(10))
答案 0 :(得分:10)
我认为在这种情况下没有任何主要差异。
一般来说,ALLOCATABLE arrays are more efficient。但在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进行此类操作。