这两个代码之间有什么区别
type Foo
real, allocatable :: bar(:)
end type
Run Code Online (Sandbox Code Playgroud)
和
type Foo
real, pointer :: bar(:)
end type
Run Code Online (Sandbox Code Playgroud)
特别是当涉及到以下代码时:
type(Foo) :: myfoo
allocate(myfoo%bar(10))
Run Code Online (Sandbox Code Playgroud)
Wil*_*cat 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
Run Code Online (Sandbox Code Playgroud)
使用gfortran编译导致此类错误消息:
Fortran runtime error: Attempting to allocate already allocated variable 'my_foo'
Run Code Online (Sandbox Code Playgroud)
相比之下,您可以使用POINTER进行此类操作.