fortran66のブログ

fortran について書きます。

POINTER を返す関数

Fortran 95/2003 Explained の5章の例を動くようにしたもの。乱数で正負の数を作り、そのうち正の数だけを選んで、ちょうどの大きさの配列へのポインターを返す関数。

実行結果

ソースプログラム

MODULE m_test
IMPLICIT NONE
CONTAINS
!--------------------------------------
FUNCTION compact(x)
REAL, POINTER :: compact(:)
REAL, INTENT(IN) :: x(:)
INTEGER :: n
n = COUNT( x > 0.0 )
ALLOCATE( compact(n) )
compact = PACK( x, x > 0.0 )
RETURN
END FUNCTION compact
!--------------------------------------
END MODULE m_test
!======================================
PROGRAM pointerfunc
USE m_test
IMPLICIT NONE
REAL :: x(100)
REAL, POINTER :: y(:)
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
x = x - 0.5
y => compact(x)
PRINT *, SIZE(y)
PRINT *, y
DEALLOCATE(y)
STOP
END PROGRAM pointerfunc