ナビゲーション:前へ 上へ 次へ
例:
ナビゲーション:前へ 上へ 次へ
3.3 割付け構造体成分
構造体成分は割付けとして宣言可能です。例:
MODULE matrix_example
TYPE MATRIX
REAL,ALLOCATABLE :: value(:,:)
END TYPE
END MODULE
割付け配列変数と同様に割付け配列成分も最初は割付けられていません。
割付け成分を持つ変数を含む手続きから抜け出す際にすべての割付け成分は
自動的に解放されます。この点はポインタ成分の場合と異なります。(ポインタ成分は自動的
に解放されません)
例:
SUBROUTINE sub(n,m)
USE matrix_example
TYPE(matrix) a,b,c
!
! a%value, b%value and c%value are all unallocated at this point.
!
ALLOCATE(a%value(n,m),b%value(n,m))
!
... do some computations, then
!
RETURN
!
! Returning from the procedure automatically deallocates a%value, b%value,
! and c%value (if they are allocated).
!
END
割付け配列成分を持つ変数を解放する場合その成分が先に解放されます。
この動作は再帰的に行われ、すべての割付け副オブジェクトがメモリリークすること
なく解放されます。
既に割付けられた関数結果の割付け成分はいずれもその結果が使用された後に自動的に 解放されます。
PROGRAM deallocation_example
TYPE inner
REAL,ALLOCATABLE :: ival(:)
END TYPE
TYPE outer
TYPE(inner),ALLOCATABLE :: ovalue
END TYPE
TYPE(outer) x
!
! At this point, x%ovalue is unallocated
!
ALLOCATE(x%ovalue(10))
!
! At this point, x%ovalue(i)%ival are unallocated, i=1,10
!
ALLOCATE(x%ovalue(2)%ival(1000),x%ovalue(5)%ival(9999))
!
! Only x%ovalue(2)%ival and x%ovalue(5)%ival are allocated
!
DEALLOCATE(x%ovalue)
!
! This has automatically deallocated x%ovalue(2)%ival and x%ovalue(5)%ival
!
END
このような型の構造体構成子内では割付け配列成分に対応する式として以下が可能です。
- NULL()組込み関数(割付けられていない配列を表す)
- 割付け配列(割付けられていても割付けられていなくても良い)
- その他の配列式(割付けられた配列を示す)
SUBROUTINE constructor_example
USE matrix_example
TYPE(matrix) a,b,c
REAL :: array(10,10) = 1
REAL,ALLOCATABLE :: alloc_array(:,:)
a = matrix(NULL())
!
! At this point, a%value is unallocated
!
b = matrix(array*2)
!
! Now, b%value is a (10,10) array with each element equal to 2.
!
c = matrix(alloc_array)
!
! Now, c%value is unallocated (because alloc_array was unallocated).
!
END
このような型の組込み代入は割付け配列成分の“深いコピー”を行います。 割付け配列成分は一旦解放されたかのように振る舞い、 式の成分が割付けられていた場合には変数の成分が正しい大きさに割付けられて値がコピーされます。
SUBROUTINE assignment_example
USE matrix_example
TYPE(matrix) a,b
!
! First we establish a value for a
!
ALLOCATE(a%value(10,20))
a%value(3,:) = 30
!
! And a value for b
!
ALLOCATE(b%value(1,1))
b%value = 0
!
! Now the assignment
!
b = a
!
! The old contents of b%value have been deallocated, and b%value now has
! the same size and contents as a%value.
!
END
ナビゲーション:前へ 上へ 次へ
