fortran66のブログ

fortran について書きます。

Fortran95/2003 Explained 12-3

ALLOCATABLE 型の変数に、配列を代入すると、自動的に代入される配列のサイズに ALLOCATE しなおされます。便利ですが、注意して使わないとバグの温床になりそうな機能でもあります。

Intel Fortran では、/assume:realloc_lhs という、コンパイル・オプションをつける必要があります。

実行結果

訂正:図が違っていました。

ソースコード

PROGRAM mrc12_3 ! Fortran95/2003 Explained 12-3
IMPLICIT NONE
REAL :: x(100), y(100)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
 y( :SIZE(compact(x)) ) = compact(x)**2
PRINT *, SIZE(y)
PRINT *, y
STOP
CONTAINS
!---------------------------------------
 FUNCTION compact(x)
  REAL, ALLOCATABLE :: compact(:)
  REAL, INTENT(IN) :: x(:)
!  INTEGER :: n             ! /assume:realloc_lhs
!  n = COUNT(x > 0.5)
!  ALLOCATE(compact(n))
  compact = PACK(x, x > 0.5)
  RETURN
 END FUNCTION compact
!---------------------------------------
END PROGRAM mrc12_3