これら2つのコードの違いは何ですか
type Foo
real, allocatable :: bar(:)
end type
と
type Foo
real, pointer :: bar(:)
end type
特に次のコードに関しては:
type(Foo) :: myfoo
allocate(myfoo%bar(10))
そのシナリオでは、主な違いは見られません。
一般に、ALLOCATABLE配列の方が効率的です。しかし、Fortran 90/95では、POINTER配列はより柔軟でした。たとえば、ALLOCATABLE配列を派生型のコンポーネントとして使用することはできませんでした。Fortran2003はその問題を修正しました。したがって、可能な場合は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を使用してそのようなことを行うことができます。