配列セクションは、配列の選択された部分です。配列セクションとは、配列からエレメントを指定したり、その配列の各エレメントから指定の添え字や派生型のコンポーネントを指定する配列サブオブジェクトのことです。配列セクションは、配列でもあります。
>>---array_name--(--section_subscript_list--)--+-----------------+--->< '-substring_range-' セクション添え字: >>-+-subscript---------+--------------------------------------->< +-subscript_triplet-+ '-vector_subscript--' |
+----------------------------------IBM 拡張----------------------------------+
subscript は、XL Fortran 内の実数式です。
+--------------------------------IBM 拡張の終り-------------------------------+
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 /)
>>-(--+-----------+--:--+-----------+--)----------------------->< '-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(10,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 を省略すると、その次元の上限が使用されます。 (想定サイズ配列のセクションを指定するとき、 subscript2 は最後の次元について必須となります。)
stride は、
XL Fortran 内の実数式です。
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 の整数の配列式です。その式のエレメントの値に対応する添え字の順序列を指定します。
ベクトル添え字は、XL Fortran 内の実数配列式です。
順序列は順番どおりでなくてもかまいません。また、値が重複して入っていることもあります。
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 セクションと呼ばれます。このようなセクションは、
注:
! 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-' |
注:
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=2, shape=(/51,10/). ! 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.