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