8

これら2つのコードの違いは何ですか

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

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

特に次のコードに関しては:

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

1 に答える 1

13

そのシナリオでは、主な違いは見られません。

一般に、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を使用してそのようなことを行うことができます。

于 2010-10-27T17:33:32.303 に答える