配列セクション

配列セクションは、配列の選択された部分です。 配列セクションとは、配列からエレメントを指定したり、その配列の各エレメントから指定のサブストリングや派生型の コンポーネントを指定する配列サブオブジェクトのことです。 配列セクションは、配列でもあります。

注:
この導入部では、構造体コンポーネントを含まない簡単なケースについて説明しています。配列セクションおよび構造体コンポーネントでは、構造体コンポーネントでもある配列セクションの指定方法に関する追加規則に ついて説明しています。



>>---array_name--(--section_subscript_list--)--+-----------------+---><
                                               '-substring_range-'
 
 

セクション添え字:

>>-+-subscript---------+---------------------------------------><
   +-subscript_triplet-+
   '-vector_subscript--'
 
 

section_subscript
特定の次元に添って、エレメントの一部を指定します。 次の組み合わせから構成されています。

subscript
スカラー整数式です。配列エレメント に説明があります。

+----------------------------------IBM 拡張----------------------------------+

添え字は、XL Fortran 内の実数式となります。

+------------------------------End of IBM 拡張-------------------------------+

subscript_triplet, vector subscript
指定された次元内の添え字の順序 (空の場合もある) を指定します。 詳細については、添え字トリプレットおよび ベクトル添え字を参照してください。

注:
配列セクションと配列エレメントを区別するために、次元のどれか 1 つ以上は、添え字トリプレットまたは ベクトル添え字でなければなりません。

INTEGER, DIMENSION(5,5,5) :: A
A(1,2,3) = 100
A(1,3,3) = 101
PRINT *, A(1,2,3)    ! A single array element, 100.
PRINT *, A(1,2:2,3)  ! A one-element array section, (/ 100 /)
PRINT *, A(1,2:3,3)  ! A two-element array section,
                     ! (/ 100, 101 /)

substring_range



>>-(--+-----------+--:--+-----------+--)-----------------------><
      '-int_expr1-'     '-int_expr2-'
 
 

int_expr1 および int_expr2 は、サブストリング式と呼ばれるスカラー整数式で、文字サブストリングで定義されています。 この式により、配列セクション内の各エレメントのサブストリングのそれぞれ左端および右端の文字を指定します。 substring_range というオプションの項目がある場合、そのセクションは文字オブジェクトの配列からで なければなりません。

配列セクションは、桁の大きい順に配置された個々の添え字、添え字トリプレット、およびベクトル添え字からの 値の順序で指定された配列エレメントによって形成されます。

たとえば、SECTION = A( 1:3, (/ 5,6,5 /), 4 ) の場合、

セクションは、この順序で、次の A のエレメントから構成されています。

A(1,5,4)   |                        |        SECTION(1,1)
A(2,5,4)   |----- First column -----|        SECTION(2,1)
A(3,5,4)   |                        |        SECTION(3,1)
A(1,6,4)     |                        |      SECTION(1,2)
A(2,6,4)     |----- Second column ----|      SECTION(2,2)
A(3,6,4)     |                        |      SECTION(3,2)
A(1,5,4)       |                        |    SECTION(1,3)
A(2,5,4)       |----- Third column -----|    SECTION(2,3)
A(3,5,4)       |                        |    SECTION(3,3)

配列セクションの一部を例としてあげます。

INTEGER, DIMENSION(20,20) :: A
! These references to array sections require loops or multiple
! statements in FORTRAN 77.
PRINT *, A(1:5,1)                   ! Contiguous sequence of elements
PRINT *, A(1:20:2,10)               ! Noncontiguous sequence of elements
PRINT *, A(:,5)                     ! An entire column
PRINT *, A( (/1,10,5/), (/7,3,1/) ) ! A 3x3 assortment of elements

関連情報:
構造体コンポーネント.

添え字トリプレット

添え字トリプレットは、2 つの添え字とストライドから構成されています。 この添え字トリプレットは、単一の次元での配列エレメント位置に対応する数字の順序を定義します。



>>-+------------+--:--+------------+--+-----------+------------><
   '-subscript1-'     '-subscript2-'  '-:--stride-'
 
 

subscript1、subscript2
次元について、指標の順序列の中での最初と最後の値を指定する添え字です。

subscript1 を省略すると、その次元の下限が使用されます。 subscript2 を省略すると、その次元の上限が使用されます。 (想定サイズ配列のセクションを指定するとき、subscript2 は最後の次元について必須となります。)

stride
スカラー整数式です。 この式で、選択された次のエレメントまでの添え字の桁数を指定します。

IBM 拡張の開始stride は、 XL Fortran 内の実数式です。 IBM 拡張の終了

stride を省略すると、1 の値をとります。 stride は、ゼロ以外の値になります。

順序列での値の計算は、DO ステートメントの実行で示す手順で行います。

配列セクションの配列エレメントを選択するうえで使用したすべての値が宣言された境界の範囲内にあれば、 添え字トリプレット内の添え字は、その次元について宣言された境界の範囲内である必要はありません。

INTEGER A(9)
PRINT *, A(1:9:2)  ! Count from 1 to 9 by 2s: 1, 3, 5, 7, 9.
PRINT *, A(1:10:2) ! Count from 1 to 10 by 2s: 1, 3, 5, 7, 9.
                   ! No element past A(9) is specified.

添え字トリプレットの例

REAL, DIMENSION(10) :: A
INTEGER, DIMENSION(10,10) :: B
CHARACTER(10) STRING(1:100)
 
PRINT *, A(:)                 ! Print all elements of array.
PRINT *, A(:5)                ! Print elements 1 through 5.
PRINT *, A(3:)                ! Print elements 3 through 10.
 
PRINT *, STRING(50:100)       ! Print all characters in
                              ! elements 50 through 100.
 
! The following statement is equivalent to A(2:10:2) = A(1:9:2)
A(2::2) = A(:9:2)             ! LHS = A(2), A(4), A(6), A(8), A(10)
                              ! RHS = A(1), A(3), A(5), A(7), A(9)
                              ! The statement assigns the odd-numbered
                              ! elements to the even-numbered elements.
 
! The following statement is equivalent to PRINT *, B(1:4:3,1:7:6)
PRINT *, B(:4:3,:7:6)         ! Print B(1,1), B(4,1), B(1,7), B(4,7)
 
PRINT *, A(10:1:-1)           ! Print elements in reverse order.
 
PRINT *, A(10:1:1)            ! These two are
PRINT *, A(1:10:-1)           ! both zero-sized.
END

ベクトル添え字

ベクトル添え字は、ランク 1 の整数の配列式です。 その式のエレメントの値に対応する添え字の順序列を指定します。

IBM 拡張の開始ベクトル添え字は、XL Fortran 内の実数配列式です。 IBM 拡張の終了

順序列は順番どおりでなくてもかまいません。また、値が重複して入っていることもあります。

INTEGER A(10), B(3), C(3)
PRINT *, A( (/ 10,9,8 /) ) ! Last 3 elements in reverse order
B = A( (/ 1,2,2 /) )       ! B(1) = A(1), B(2) = A(2), B(3) = A(2) also
END

2 つ以上のエレメントが同じ値を持つベクトル添え字が ある配列セクションは、多対 1 セクションと呼ばれます。 このようなセクションは、次のようであってはなりません。

注:

  1. 内部ファイルとして使用される配列セクションには、ベクトル添え字は使えません。

  2. ベクトル添え字を持つ配列セクションを実引き数として渡す場合には、関連した仮引き数を定義または 再定義することはできません。

  3. ベクトル添え字を持つ配列セクションは、ポインター割り当てステートメントのターゲットにはなりません。
! We can use the whole array VECTOR as a vector subscript for A and B
INTEGER, DIMENSION(3) :: VECTOR= (/ 1,3,2 /), A, B
INTEGER, DIMENSION(4) :: C = (/ 1,2,4,8 /)
A(VECTOR) = B            ! A(1) = B(1), A(3) = B(2), A(2) = B(3)
A = B( (/ 3,2,1 /) )     ! A(1) = B(3), A(2) = B(2), A(3) = B(1)
PRINT *, C(VECTOR(1:2))  ! Prints C(1), C(3)
END

配列セクションおよびサブストリングの範囲

サブストリングの範囲を持つ配列セクションの場合、結果における各エレメントは、その配列セクションの対応する エレメントの指定された文字ストリングです。 右端の配列名またはコンポーネント名は、型文字でなければなりません。

PROGRAM SUBSTRING
TYPE DERIVED
  CHARACTER(10) STRING(5)       ! Each structure has 5 strings of 10 chars.
END TYPE DERIVED
TYPE (DERIVED) VAR, ARRAY(3,3)  ! A variable and an array of derived type.
 
VAR%STRING(:)(1:3) = 'abc'      ! Assign to chars 1-3 of elements 1-5.
VAR%STRING(3:)(4:6) = '123'     ! Assign to chars 4-6 of elements 3-5.
 
ARRAY(1:3,2)%STRING(3)(5:10) = 'hello'
                                ! Assign to chars 5-10 of the third element in
                                ! ARRAY(1,2)%STRING, ARRAY(2,2)%STRING, and
END                             ! ARRAY(3,2)%STRING

配列セクションおよび構造体コンポーネント

配列セクションおよび構造体コンポーネントがどのようにオーバーラップしているかを理解するには、構造体コンポーネントの構文について理解しておく必要があります。

配列セクションとしてこの項の始めに定義したものは、考え得る配列セクションのサブセットにすぎません。 配列名または section_subscript_list を持つ配列名は、構造体コンポーネントのサブオブジェクトで あることがあります。

struct_sect_subobj:



>>-object_name--+------------------------------+---------------->
                '-(--section_subscript_list--)-'
 
   .----------------------------------------------------.
   V                                                    |
>----+-%-+--comp_name--+------------------------------+-+------->
     '-.-'             '-(--section_subscript_list--)-'
 
>--+-----------------+-----------------------------------------><
   '-substring_range-'
 
 

object_name
派生型のオブジェクトの名前です。

section_subscript_list、substring_range
配列セクションで定義されているものと同じです。

comp_name
派生型コンポーネントの名前です。

% または .
区切り文字。

注:
. (ピリオド) 区切り文字は IBM 拡張です。

注:

  1. 最後のコンポーネントの型によって配列の型が決まります。

  2. 構造体コンポーネントの一部分のみがゼロ以外のランクを持つことができます。 右端の comp_name は、ゼロ以外のランクを 持つ section_subscript_list を持つか、あるいは別の部分がゼ ロ以外のランクを持たなければなりません。

  3. ゼロ以外のランクを持つ部分から右側のすべての部分では、ALLOCATABLE または POINTER 属性を指定しないでください。
TYPE BUILDING_T
  LOGICAL RESIDENTIAL
END TYPE BUILDING_T
TYPE STREET_T
  TYPE (BUILDING_T) ADDRESS(500)
END TYPE STREET_T
TYPE CITY_T
  TYPE (STREET_T) STREET(100,100)
END TYPE CITY_T
TYPE (CITY_T) PARIS
TYPE (STREET_T) S
TYPE (BUILDING_T) RESTAURANT
! LHS is not an array section, no subscript triplets or vector subscripts.
PARIS%STREET(10,20) = S
! None of the parts are array sections, but the entire construct
!   is a section because STREET has a nonzero rank and is not
!   the rightmost part.
PARIS%STREET%ADDRESS(100) = BUILDING_T(.TRUE.)
 
! STREET(50:100,10) is an array section, making the LHS an array section
!   with rank=1, shape=(/51/).
! ADDRESS(123) must not be an array section because only one can appear
!   in a reference to a structure component.
PARIS%STREET(50:100,10)%ADDRESS(123)%RESIDENTIAL = .TRUE.
END

配列セクションのランクおよび形状

構造体コンポーネントのサブオブジェクトではない配列セクションの場合、 そのランクは section_subscript_list 内の 添え字トリプレットおよびベクトル添え字の数です。形状配列内のエレメントの数は、添え字トリプレットとベクトル添え字の数と同じで、その形状配列内の各エレメントは、対応する 添え字トリプレットまたはベクトル添え字によって 指定された順序列内の整数値の数です。

構造体コンポーネントのサブオブジェクトである配列セクションの場合、 そのランクと形状は、配列名または配列セクションであるコンポーネントの 一部のランクおよび形状と同じです。

DIMENSION :: ARR1(10,20,100)
TYPE STRUCT2_T
  LOGICAL SCALAR_COMPONENT
END TYPE
TYPE STRUCT_T
  TYPE (STRUCT2_T), DIMENSION(10,20,100) :: SECTION
END TYPE
 
TYPE (STRUCT_T) STRUCT
 
! One triplet + one vector subscript, rank = 2.
! Triplet designates an extent of 10, vector subscript designates
!   an extent of 3, thus shape = (/ 10,3 /).
ARR1(:, (/ 1,3,4 /), 10) = 0
 
! One triplet, rank = 1.
! Triplet designates 5 values, thus shape = (/ 5 /).
STRUCT%SECTION(1,10,1:5)%SCALAR_COMPONENT = .TRUE.
 
! Here SECTION is the part of the component that is an array,
!   so rank = 3 and shape = (/ 10,20,100 /), the same as SECTION.
STRUCT%SECTION%SCALAR_COMPONENT = .TRUE.
IBM Copyright 2003