Разница между указателем и ALLOCATABLE - PullRequest
5 голосов
/ 26 октября 2010

в чем разница между этими двумя кодами

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

и

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

в частности, когда дело доходит до следующего кода:

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

1 Ответ

10 голосов
/ 27 октября 2010

Я не вижу принципиальной разницы в этом сценарии.

В общем случае ALLOCATABLE массивы более эффективны .Но в Fortran 90/95 массивы POINTER были более гибкими.Например, было невозможно использовать ALLOCATABLE массивы в качестве компонентов производных типов.Фортран 2003 исправил эту проблему.Поэтому используйте ALLOCATABLE массивы, когда можете.

EDIT

Просто хочу отметить существенную разницу в поведении программы при попытке выделить уже выделенную сущность.Если объект 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'

В отличие от этого вы можете делать такие вещи с помощью указателей.

...