fortran66のブログ

fortran について書きます。

Fortran95/2003 Explained 12-2

ALLOCATABLE 型の変数を、未ALLOCATE のままサブルーチンへ送り、そちらで ALLOCATE して戻してやることができるようになりました。

実行結果。

ソースコード

MODULE m_mrc12_2 ! Fortran95/2003 Explained 12-2
IMPLICIT NONE
CONTAINS
!---------------------------------------
SUBROUTINE load(array, iunit)
 REAL, ALLOCATABLE, INTENT(OUT) :: array(:, :, :)
 INTEGER, INTENT(IN) :: iunit
 INTEGER :: n1, n2, n3
 READ(iunit) n1, n2, n3
 ALLOCATE( array(n1, n2, n3) )
 READ(iunit) array
RETURN
END SUBROUTINE load
!---------------------------------------
END MODULE m_mrc12_2
!=========================================
PROGRAM mrc12_2
USE m_mrc12_2
IMPLICIT NONE
REAL :: x(2, 2, 3)
REAL, ALLOCATABLE :: y(:, :, :)
INTEGER :: i
CALL RANDOM_SEED()
CALL RANDOM_NUMBER(x)
WRITE(9) (SIZE(x, i), i = 1, 3)
WRITE(9) x
CLOSE(9)
CALL load(y, 9)
PRINT *, x
PRINT *, y
PRINT *, x - y
STOP   
END PROGRAM mrc12_2