这两个代码有什么区别

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


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

特别是在涉及以下代码时:
type(Foo) :: myfoo
allocate(myfoo%bar(10))

最佳答案

在这种情况下,我没有看到任何主要区别。

一般来说, ALLOCATABLE arrays are more efficient 。但在 Fortran 90/95 中,指针数组更加灵活。例如,不可能将 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 做这样的事情。

关于fortran - POINTER 和 ALLOCATABLE 的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4023371/

10-12 19:58