COBOL2002 Javaプログラム呼び出し機能ガイド


3.2.3 配列操作のコーディング

Javaコンポーネントの配列オブジェクトを操作する手順を説明します。

〈この項の構成〉

(1) 配列オブジェクトの構成と生成のコーディング

Javaの配列オブジェクトの持つ配列は1次元配列だけです。多次元配列は,オブジェクト型の配列オブジェクトと,基本型またはオブジェクト型の配列オブジェクトとの組み合わせで表現されます。多次元配列については,「(4) 多次元配列を構成する配列オブジェクトの生成と操作のコーディング」を参照してください。

1次元配列について次に示します。

[図データ]

配列オブジェクトを生成する例を次に示します。

       01 INT-ARRAY-TYPE  PIC X(256) VALUE '[I'.
       01 INT-ARRAY-LEN   PIC S9(9) USAGE COMP VALUE 10.
       01 INT-ARRAYOBJ    USAGE POINTER.
       01 STR-ARRAY-TYPE  PIC X(256) VALUE '[Ljava/lang/String;'.
       01 STR-ARRAY-LEN   PIC S9(9) USAGE COMP VALUE 20.
       01 STR-ARRAYOBJ    USAGE POINTER.
       
      *> int型の配列オブジェクトを生成する。
           CALL 'CBLJNEWARRAY' USING CBLJENV INT-ARRAY-TYPE
                                             INT-ARRAY-LEN
                                             INT-ARRAYOBJ.
       
      *> String型の配列オブジェクトを生成する。
           CALL 'CBLJNEWARRAY' USING CBLJENV STR-ARRAY-TYPE
                                             STR-ARRAY-LEN
                                             STR-ARRAYOBJ.

(2) 基本型の配列オブジェクト操作のコーディング

基本型の配列オブジェクトを操作する場合,いったん配列を配列オブジェクトから取り出して操作し,操作終了後に配列オブジェクトに戻す手順になります。

[図データ]

配列オブジェクトから配列を出し入れするために,CBLJGETARRAYADDRサービスルーチンとCBLJRELEASEARRAYサービスルーチンが用意されています。

基本型の配列オブジェクトを操作する例を次に示します。

       01 ARRAYOBJ USAGE POINTER.
       01 ARRAYLEN PIC S9(9)  USAGE COMP.
       01 ARRAYADR USAGE POINTER.
       01 INTARRAY ADDRESSED BY P.
         02 ELEMENTS PIC S9(9) USAGE COMP
                     OCCURS m TIMES DEPENDING ON ARRAYLEN.
         
      *> 配列オブジェクトから配列アドレスを取り出し,
      *> 反復項目にマッピングする
           CALL 'CBLJGETARRAYADDR' USING CBLJENV ARRAYOBJ ARRAYADR.
           CALL 'CBLJARRAYLENGTH'  USING CBLJENV ARRAYOBJ ARRAYLEN.
           COMPUTE P = ARRAYADR.
      *> 配列の3番目の要素の参照
           DISPLAY ELEMENTS(3).
      *> 配列の3番目の要素の更新
           MOVE 100 TO ELEMENTS(3).
      *> 配列要素の配列オブジェクトへの書き戻し
           CALL 'CBLJRELEASEARRAY' USING CBLJENV ARRAYOBJ ARRAYADR.

反復回数(m)には想定される配列要素数の上限を指定してください。

注意事項
  • INTARRAYによる集団項目操作はしないでください。OCCURS句で指定した反復回数が配列オブジェクトの要素数を超える場合,不当領域参照の要因になります。

  • Javaの配列オブジェクトでは要素の添字が0から始まりますが,COBOLの繰り返し項目では要素の添字は1から指定します。添字nで参照する基本型配列オブジェクトの要素を,COBOLの繰り返し項目で参照する場合は添字n+1で参照します。

CBLJGETARRAYADDRサービスルーチンについては,「6.1.6 配列オブジェクト操作」の「(5) CBLJGETARRAYADDR」を参照してください。

CBLJRELEASEARRAYサービスルーチンについては,「6.1.6 配列オブジェクト操作」の「(6) CBLJRELEASEARRAY」を参照してください。

(3) オブジェクト型の配列オブジェクト操作のコーディング

オブジェクト型の配列オブジェクトの場合,CBLJSETOBJARRAYサービスルーチン(格納用)とCBLJGETOBJARRAYサービスルーチン(取出用)を使って要素のオブジェクトの出し入れをします。

オブジェクト型の配列オブジェクトを操作する例を次に示します。

      *> 配列オブジェクトのJavaオブジェクト参照
       01 ARRAYOBJ USAGE POINTER.
      *> 要素のJavaオブジェクト参照
       01 ELEMENT  USAGE POINTER.
      *> 要素の添字
       01 IDX      PIC S9(9) USAGE COMP.
 
      *> オブジェクト型の配列オブジェクトから3番目の要素(オブジェクト)を取り出す。
           MOVE 2 TO IDX.
           CALL 'CBLJGETOBJARRAY' USING CBLJENV ARRAYOBJ IDX ELEMENT.
 
      *> オブジェクト型の配列オブジェクトに3番目の要素(オブジェクト)を格納する。
           MOVE 2 TO IDX.
           CALL 'CBLJSETOBJARRAY' USING CBLJENV ARRAYOBJ IDX ELEMENT.
注意事項

Javaの配列オブジェクトでは要素の添字が0から始まります。

CBLJSETOBJARRAYサービスルーチンについては,「6.1.6 配列オブジェクト操作」の「(3) CBLJSETOBJARRAY」を参照してください。

CBLJGETOBJARRAYサービスルーチンについては,「6.1.6 配列オブジェクト操作」の「(4) CBLJGETOBJARRAY」を参照してください。

(4) 多次元配列を構成する配列オブジェクトの生成と操作のコーディング

多次元配列は,オブジェクト型の配列オブジェクトと,基本型またはオブジェクト型の配列オブジェクト(最下位次元だけ)との組み合わせで表現されます。

基本型の2次元配列について次に示します。

[図データ]

int型の3×4の2次元配列を生成する例を次に示します。

       01 D1-ARRAY-TYPE  PIC X(256) VALUE '[[I'.
       01 D1-ARRAYOBJ    USAGE POINTER.
       01 D1-ARRAYLEN    PIC S9(9)  USAGE COMP VALUE 3.
       01 D2-ARRAY-TYPE  PIC X(256) VALUE '[I'.
       01 D2-ARRAYOBJ    USAGE POINTER.
       01 D2-ARRAYLEN    PIC S9(9)  USAGE COMP VALUE 4.
       01 I              PIC S9(9)  USAGE COMP.
      *> 1次元の配列オブジェクトを生成する。
           CALL 'CBLJNEWARRAY' USING CBLJENV D1-ARRAY-TYPE D1-ARRAYLEN
                                             D1-ARRAYOBJ.
           PERFORM VARYING I FROM 0 BY 1 UNTIL I > D1-ARRAYLEN - 1
      *> 2次元の配列オブジェクトを生成する。
             CALL 'CBLJNEWARRAY'    USING CBLJENV D2-ARRAY-TYPE
                                                  D2-ARRAYLEN
                                                  D2-ARRAYOBJ
             CALL 'CBLJSETOBJARRAY' USING CBLJENV D1-ARRAYOBJ
                                                  I
                                                  D2-ARRAYOBJ
           END-PERFORM.

int型の2×3×4の3次元配列の要素の値を合計する例を次に示します。

      *> 1次元目の配列オブジェクト参照用ワーク
       01 D1-ARRAYOBJ    USAGE POINTER.
       01 LEN-1          PIC S9(9) USAGE COMP.
      *> 2次元目の配列オブジェクト参照用ワーク
       01 D2-ARRAYOBJ    USAGE POINTER.
       01 LEN-2          PIC S9(9) USAGE COMP.
      *> 3次元目の配列オブジェクト参照用ワーク
       01 D3-ARRAYOBJ    USAGE POINTER.
       01 LEN-3          PIC S9(9) USAGE COMP.
      *> 配列オブジェクト参照用ワーク
       01 ARRAYADDR      USAGE POINTER.
       01 ARRAYLEN       PIC S9(9)  USAGE COMP.
       01 INTARRAY       ADDRESSED BY P.
         02 ELEMENTS     PIC S9(9) USAGE COMP
                         OCCURS 24 TIMES DEPENDING ON ARRAYLEN.
       01 I              PIC S9(9) USAGE COMP.
       01 J              PIC S9(9) USAGE COMP.
       01 K              PIC S9(9) USAGE COMP.
       01 TOTAL          PIC S9(9) USAGE COMP.
       
           MOVE 0 TO TOTAL.
           CALL 'CBLJARRAYLENGTH'  USING CBLJENV D1-ARRAYOBJ LEN-1
       
           PERFORM VARYING I FROM 0 BY 1 UNTIL I > LEN-1 - 1
       
      *> 1次元の配列オブジェクトから2次元の配列オブジェクトを取り出す。
             CALL 'CBLJGETOBJARRAY'  USING CBLJENV
                                        D1-ARRAYOBJ I D2-ARRAYOBJ
             CALL 'CBLJARRAYLENGTH'  USING CBLJENV D2-ARRAYOBJ LEN-2
       
             PERFORM VARYING J FROM 0 BY 1 UNTIL J > LEN-2 - 1
       
      *> 2次元の配列オブジェクトから3次元の配列オブジェクトを取り出す。
               CALL 'CBLJGETOBJARRAY'  USING CBLJENV
                                          D2-ARRAYOBJ J D3-ARRAYOBJ
               CALL 'CBLJARRAYLENGTH'  USING CBLJENV D3-ARRAYOBJ LEN-3
      
      *> 3次元の配列オブジェクトから基本型の配列を取り出す。
               CALL 'CBLJGETARRAYADDR' USING CBLJENV
                                           D3-ARRAYOBJ ARRAYADDR
      *> 基本型の配列をCOBOLの反復項目にマッピングする。
               COMPUTE P = ARRAYADDR 
       
      *> 基本型の配列の要素の値を加算する。(COBOLでの添字は1から)
               PERFORM VARYING K FROM 1 BY 1 UNTIL K > LEN-3
                 COMPUTE TOTAL = TOTAL + ELEMENTS(K)
               END-PERFORM
       
      *> 基本型の配列をオブジェクト参照に反映させて解放する。
               CALL 'CBLJRELEASEARRAY' USING CBLJENV
                                          D3-ARRAYOBJ ARRAYADDR
       
      *> 取り出した3次元の配列オブジェクトのオブジェクト参照を解放する。
               CALL 'CBLJRELEASE'      USING CBLJENV D3-ARRAYOBJ
       
             END-PERFORM
       
      *> 取り出した2次元の配列オブジェクトのオブジェクト参照を解放する。
             CALL 'CBLJRELEASE'      USING CBLJENV D2-ARRAYOBJ
       
           END-PERFORM.
       
      *> 結果を表示する。
           DISPLAY 'TOTAL=' TOTAL.
注意事項
  • Javaの配列オブジェクトでは要素の添字が0から始まりますが,COBOLの繰り返し項目では要素の添字は1から指定します。添字nで参照する基本型配列オブジェクトの要素を,COBOLの繰り返し項目で参照する場合は添字n+1で参照します。

  • 配列オブジェクトから取り出した配列オブジェクトのオブジェクト参照は必ず解放する必要があります。ただし,CBLJGETOBJARRAYサービスルーチン呼び出しの受け取り項目に指定されている場合,格納されていた配列オブジェクトのオブジェクト参照は自動的に解放されます。