POINTER和ALLOCATABLE之间的区别

时间:2010-10-26 11:55:09

标签: fortran fortran90

这两个代码之间有什么区别

type Foo
   real, allocatable :: bar(:)
end type

type Foo
   real, pointer :: bar(:)
end type

特别是在涉及以下代码时:

type(Foo) :: myfoo
allocate(myfoo%bar(10))

1 个答案:

答案 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进行此类操作。