CONTIGUOUS (Fortran 2008)
目的
CONTIGUOUS 属性は、配列ポインター、想定形状配列、または想定ランク・オブジェクトの配列エレメントが他のデータ・オブジェクトによって分離されないことを指定します。
CONTIGUOUS 属性を持つ配列ポインターは、連続するターゲットに関連付けられたポインターのみになります。 CONTIGUOUS 属性を持つ想定形状配列または想定ランク・オブジェクトは常に連続していますが、対応する実引数は連続している場合としていない場合があります。 詳しくは、規則セクションを参照してください。
規則
CONTIGUOUS 属性で指定されるエンティティーは、配列ポインター、想定形状配列、または想定ランク・オブジェクトのいずれかでなければなりません。
ポインターの割り当てにおいて、ポインターが CONTIGUOUS 属性を持つ場合、関連付けられるターゲットは連続していなければなりません。CONTIGUOUS 属性を持つポインター仮引数に対応する実引数は、単純連続でなければなりません。
- 仮引数に関連付ける一時的連続引数を作成します。
- その一時的連続引数を実引数の値で初期化します。
- プロシージャーから制御が戻ったら、一時的連続引数の値を実引数に対して逆にコピーします。注: 実引数が INTENT(IN) として指定されている場合は、値はコピーされません。
実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された非ポインター配列であるが、単純連続ではなく、対応する仮引数に VOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない想定形状配列でなければなりません。
実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された配列ポインターであるが、CONTIGUOUS 属性は設定されておらず、対応する仮引数に VOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない配列ポインターまたは想定形状配列でなければなりません。
互換属性
例
例 1: 配列ポインターに指定された CONTIGUOUS 属性
INTEGER, CONTIGUOUS, POINTER :: ap(:)
INTEGER, TARGET :: targ(10)
INTEGER, POINTER :: ip(:)
LOGICAL :: contig
! Invalid because ap is contiguous. A severe error is issued at compile time.
ap => targ(1:10:2)
ip => targ(1:10:2)
! contig has a value of .FALSE.
contig = IS_CONTIGUOUS(ip)
! contig has a value of .TRUE.
ALLOCATE(ip(10))
contig = IS_CONTIGUOUS(ip)
例 2: 想定形状配列に指定された CONTIGUOUS 属性
LOGICAL :: contig
! Define a derived type named base
TYPE base(k, j, l)
INTEGER, KIND :: k, j
INTEGER, LEN :: l
INTEGER(k) :: x
INTEGER(j) :: y(l)
END TYPE
! Declare an allocatable, assumed-shape array b of base type
TYPE(base(4, 8, 0)), ALLOCATABLE :: b(:)
! Allocate two elements to b
ALLOCATE(b(2))
! contig has a value of .FALSE.
contig = IS_CONTIGUOUS(b%x)
例 3: 想定形状配列に指定された CONTIGUOUS 属性
INTEGER, POINTER :: p(:)
INTEGER, TARGET :: t(10) = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
p => t(1:10:2)
! The actual argument p, which corresponds to the contiguous dummy argument,
! is not contiguous. The compiler makes it contiguous by creating a temporary
! contiguous argument.
CALL fun(p)
CONTAINS
SUBROUTINE fun(arg)
! Contiguous dummy argument arg
INTEGER, CONTIGUOUS :: arg(:)
PRINT *, arg(1)
END SUBROUTINE