CONTIGUOUS (Fortran 2008)

目的

CONTIGUOUS 属性は、配列ポインター、想定形状配列TS 29113 の始まり、または想定ランク・オブジェクトTS 29113 の終わりの配列エレメントが他のデータ・オブジェクトによって分離されないことを指定します。

CONTIGUOUS 属性を持つ配列ポインターは、連続するターゲットに関連付けられたポインターのみになります。 CONTIGUOUS 属性を持つ想定形状配列TS 29113 の始まりまたは想定ランク・オブジェクトTS 29113 の終わりは常に連続していますが、対応する実引数は連続している場合としていない場合があります。 詳しくは、規則セクションを参照してください。

構文

構文図を読む構文図をスキップする
>>-CONTIGUOUS--+----+--contiguous_array_list-------------------><
               '-::-'                          

contiguous_array
連続する配列

規則

CONTIGUOUS 属性で指定されるエンティティーは、配列ポインター、想定形状配列TS の始まり、または想定ランク・オブジェクトTS 29113 の終わりのいずれかでなければなりません。

ポインターの割り当てにおいて、ポインターが CONTIGUOUS 属性を持つ場合、関連付けられるターゲットは連続していなければなりません。CONTIGUOUS 属性を持つポインター仮引数に対応する実引数は、単純連続でなければなりません。

CONTIGUOUS 属性を持つ想定形状配列仮引数TS の始まりまたは想定ランク仮引数TS 29113 の終わりに対応する実引数が連続しておらず、Fortran から呼び出しが行われるか、呼び出し先が Fortran プロシージャーである場合、コンパイラーは以下のアクションを実行することによってこの実引数を連続にします。
  1. 仮引数に関連付ける一時的連続引数を作成します。
  2. その一時的連続引数を実引数の値で初期化します。
  3. プロシージャーから制御が戻ったら、一時的連続引数の値を実引数に対して逆にコピーします。
    注: 実引数が INTENT(IN) として指定されている場合は、値はコピーされません。

実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された非ポインター配列であるが、単純連続ではなく、対応する仮引数に VOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない想定形状配列でなければなりません。

実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された配列ポインターであるが、CONTIGUOUS 属性は設定されておらず、対応する仮引数に VOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない配列ポインターまたは想定形状配列でなければなりません。

互換属性

以下の表に、CONTIGUOUS 属性と互換性のある属性のリストを示します。
表 1. CONTIGUOUS 属性と互換性のある属性
AUTOMATIC  1  OPTIONAL SAVE
ASYNCHRONOUS POINTER STATIC  1 
DIMENSION PRIVATE TARGET
EXTERNAL PROTECTED  2  VOLATILE
INTENT PUBLIC  
注:
  •  1  IBM 拡張
  •  2  Fortran 2003

例 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