Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第7章 アプリケーションの開発(COBOL)> 7.8 データ型に対するマッピング

7.8.8 配列

(1)IDLマッピング

 IDL言語で配を指定した場合、COBOLのOCCURS句でデータ宣言します。配列名は"モジュール名-インタフェース名-配列名-V"となり、用途に応じてCOPY文で定義します。配列のインデックスは1から始まり<配列の大きさ>までとなります。また、配列の領域獲得関数(関数名は"モジュール名-インタフェース名-配列名-ALLOC"、以降XX-ALLOC関数と呼ぶ)がIDLコンパイラで生成されます。
 以降では、以下のIDL定義例をもとに説明します。

IDL言語

  module ODsample{
      interface  arraytest{
          typedef long    fix[4][3][2];      // 配列(固定長) 
          typedef string  str[2][3][4];      // 配列(可変長) 
          fix    op1(in fix para1, out fix para2, inout fix para3 ); 
          str    op2(in str para1, out str para2, inout str para3 ); 
      };
  };

COBOL

  01 ODSAMPLE-ARRAYTEST-FIX. 
    02 FILLER OCCURS 4. 
      03 FILLER OCCURS 3. 
        04 FILLER OCCURS 2. 
          05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-FIX-V. 
  01 ODSAMPLE-ARRAYTEST-STR. 
    02 FILLER OCCURS 2. 
      03 FILLER OCCURS 3. 
        04 FILLER OCCURS 4. 
          05 ODSAMPLE-ARRAYTEST-STR-V USAGE IS POINTER.

(2)クライアントアプリケーションで扱うパラメタ(固定長)

 配列(固定長)のin、out、inoutパラメタを扱う場合、領域の獲得/解放を行う必要はありません。復帰値は、スタブで自動的に配列領域が獲得されるため、アプリケーションで不要になった時点でCORBA-FREE関数で解放する必要があります。
 以下にクライアントアプリケーションでの処理例を示します。

  ENVIRONMENT DIVISION. 
  DATA DIVISION. 
  WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 PARA1. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA1-V. 
     01 PARA2.
       02 FILLER OCCURS 4.
         03 FILLER OCCURS 3.
           04 FILLER OCCURS 2.
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA2-V.
     01 PARA3. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA3-V. 
     01 FIX0.
       02 FILLER OCCURS 4.
         03 FILLER OCCURS 3.
           04 FILLER OCCURS 2.
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-FIX0-V.
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY J. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY K.
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 

   PROCEDURE DIVISION. 
 
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
              PERFORM VARYING K FROM 1 BY 1 UNTIL K > 2
                  MOVE I TO ODSAMPLE-ARRAYTEST-PARA1-V( I J K ) 
                  COMPUTE NUM = I * 10
                  MOVE NUM TO ODSAMPLE-ARRAYTEST-PARA3-V( I J K ) 
              END-PERFORM
         END-PERFORM
    END-PERFORM. 

  CALL "ODSAMPLE-ARRAYTEST-OP1" USING
        OBJ
        PARA1
        PARA2
        PARA3
        ENV
        FIX0.

(3)クライアントアプリケーションで扱うパラメタ(可変長)

 配列(可変長)のinoutパラメタ、outパラメタ、復帰値は、スタブでXX-ALLOC関数により配列領域が獲得されるため、アプリケーションで不要になった時点でCORBA-FREE関数で解放する必要があります。
 以下にクライアントアプリケーションでの処理例を示します。

   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
     01 COPY ENVIRONMENT IN CORBA REPLACING CORBA-ENVIRONMENT BY ENV. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 STR1. 
       02 FILLER OCCURS 2. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 4. 
             05 ODSAMPLE-ARRAYTEST-STR1-V USAGE IS POINTER. 
     01 STR2 USAGE POINTER. 
     01 STR3 USAGE POINTER. 
     01 STR0 USAGE POINTER. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY J. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY K. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 
     01 STR1 X(20). 
     01 STR2 X(20). 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY LSIZE.
     LINKAGE SECTION.
     01 STR3-P.
       02 FILLER OCCURS 2.
         03 FILLER OCCURS 3.
           04 FILLER OCCURS 4.
             05 ODSAMPLE-ARRAYTEST-STR3-V USAGE IS POINTER.

   PROCEDURE DIVISION. 
 
  CALL "ODSAMPLE-ARRAYTEST-STR-ALLOC" USING  STR3.
  SET ADDRESS OF STR3-P TO STR3.

  PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
        PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
              PERFORM VARYING K FROM 1 BY 1 UNTIL K > 4
                    MOVE "str1[I][J][K]" TO STR1-D
                    MOVE "str3[I][J][K]" TO STR2-D 

                    EVALUATE I
                      WHEN 1
                        INSPECT STR1-D REPLACING ALL "I" BY "0" 
                        INSPECT STR2-D REPLACING ALL "I" BY "0"
                      WHEN 2
                        INSPECT STR1-D REPLACING ALL "I" BY "1" 
                        INSPECT STR2-D REPLACING ALL "I" BY "1" 
                    END-EVALUATE

                    EVALUATE J
                      WHEN 1
                        INSPECT STR1-D REPLACING ALL "J" BY "0" 
                        INSPECT STR2-D REPLACING ALL "J" BY "0" 
                      WHEN  2
                        INSPECT STR1-D REPLACING ALL "J" BY "1" 
                        INSPECT STR2-D REPLACING ALL "J" BY "1" 
                      WHEN  3
                        INSPECT STR1-D REPLACING ALL "J" BY "2" 
                        INSPECT STR2-D REPLACING ALL "J" BY "2" 
                    END-EVALUATE

                    EVALUATE K
                      WHEN 1
                        INSPECT STR1-D REPLACING ALL "K" BY "0" 
                        INSPECT STR2-D REPLACING ALL "K" BY "0" 
                      WHEN 2
                        INSPECT STR1-D REPLACING ALL "K" BY "1" 
                        INSPECT STR2-D REPLACING ALL "K" BY "1" 
                      WHEN 3
                        INSPECT STR1-D REPLACING ALL "K" BY "2" 
                        INSPECT STR2-D REPLACING ALL "K" BY "2" 
                      WHEN 4
                        INSPECT STR1-D REPLACING ALL "K" BY "3" 
                        INSPECT STR2-D REPLACING ALL "K" BY "3" 
                    END-EVALUATE

                    MOVE FUNCTION LENG(STR1-D) TO LSIZE
                    CALL "CORBA-STRING-SET" USING
                       ODSAMPLE-ARRAYTEST-STR1-V( I J K ) 
                       LSIZE 
                       STR1-D
                    MOVE FUNCTION LENG(STR2-D) TO LSIZE
                    CALL "CORBA-STRING-SET" USING
                       ODSAMPLE-ARRAYTEST-STR3-V( I J K ) 
                       LSIZE 
                       STR2-D
             END-PERFORM
        END-PERFORM
  END-PERFORM. 

  CALL "ODSAMPLE-ARRAYTEST-OP2" USING
    OBJ
    STR1
    STR2
    STR3
    ENV
    STR0. 
* inパラメタは、データ値の設定時に獲得した領域のみを解放してください。
  PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
       PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
             PERFORM VARYING K FROM 1 BY 1 UNTIL K > 4
                   CALL "CORBA-FREE" USING  ODSAMPLE-ARRAYTEST-STR1-V( I J K ) 
             END-PERFORM
     END-PERFORM
  END-PERFORM. 

  CALL "CORBA-FREE"  USING
    STR0. 
  CALL "CORBA-FREE"  USING
    STR2.
  CALL "CORBA-FREE"  USING
    STR3.

(4)サーバアプリケーションで扱うパラメタ(固定長)

 以下にサーバアプリケーションの処理例を示します。

   PROGRAM-ID. "ODSAMPLE-ARRAYTEST-OP1"
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
    LINKAGE SECTION. 
     01 ENV. 
       03 MAJOR PIC 9(9) COMP-5. 
         88 CORBA-NO-EXCEPTION VALUE 0. 
         88 CORBA-USER-EXCEPTION VALUE 1. 
         88 CORBA-SYSTEM-EXCEPTION VALUE 2. 
       03 IDL-ID USAGE POINTER. 
       03 MINOR PIC 9(9) COMP-5. 
       03 IDL-STATUS PIC 9(9) COMP-5. 
       03 PARAM USAGE POINTER. 
       03 MAGIC PIC 9(9) COMP-5. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 PARA1. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA1-V.
     01 PARA2. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA2-V. 
     01 PARA3. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
              05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-PARA3-V. 
     01 FIX. 
       02 FILLER OCCURS 4. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 2. 
             05 COPY LONG IN CORBA REPLACING CORBA-LONG BY ODSAMPLE-ARRAYTEST-FIX-V. 
             05 ODSAMPLE-ARRAYTEST-FIX-V USAGE IS POINTER. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY J. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY K. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 

   PROCEDURE DIVISION USING OBJ PARA1 PARA2 PARA3 ENV FIX. 

  *outパラメタの処理
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 2
                      COMPUTE NUM = I + J + K
                      MOVE NUM TO ODSAMPLE-ARRAYTEST-PARA2-V( I J K ) 
                END-PERFORM
         END-PERFORM
    END-PERFORM.
  *inoutパラメタの処理
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 2
                      COMPUTE NUM = (I + J + K) * 10
                      MOVE NUM TO ODSAMPLE-ARRAYTEST-PARA3-V( I J K ) 
                END-PERFORM
         END-PERFORM
    END-PERFORM.
  *復帰値の処理
    PERFORM VARYING I FROM 1 BY 1 UNTIL I > 4
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 2
                      COMPUTE NUM = I * J * K
                      MOVE NUM TO ODSAMPLE-ARRAYTEST-FIX-V( I J K ) 
                END-PERFORM
         END-PERFORM
    END-PERFORM.

(5)サーバアプリケーションで扱うパラメタ(可変長)

 配列(可変長)のin、inoutパラメタを扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out、復帰値には、XX-ALLOC関数で配列領域を獲得してデータを設定します。inoutパラメタで領域を拡張する場合、一度CORBA-FREE関数でデータ域を解放し、再度領域を獲得します。ここで獲得した領域はスケルトンで自動的に解放されます。
 以下にサーバアプリケーションでの処理例を示します。

   PROGRAM-ID. "ODSAMPLE-ARRAYTEST-OP2"
   ENVIRONMENT DIVISION. 
   DATA DIVISION. 
   WORKING-STORAGE SECTION. 
     COPY CONST IN CORBA. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY I. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY J. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY K. 
     01 COPY LONG IN CORBA REPLACING CORBA-LONG BY NUM. 
     01 STR-OUT PIC X(20).
     01 STR-IO PIC X(20).
     01 STR-RET PIC X(20).
    LINKAGE SECTION. 
     01 ENV. 
       03 MAJOR PIC 9(9) COMP-5. 
         88 CORBA-NO-EXCEPTION VALUE 0. 
         88 CORBA-USER-EXCEPTION VALUE 1. 
         88 CORBA-SYSTEM-EXCEPTION VALUE 2. 
       03 IDL-ID USAGE POINTER. 
       03 MINOR PIC 9(9) COMP-5. 
       03 IDL-STATUS PIC 9(9) COMP-5. 
       03 PARAM USAGE POINTER. 
       03 MAGIC PIC 9(9) COMP-5. 
     01 COPY OBJECT IN CORBA REPLACING CORBA-OBJECT BY OBJ. 
     01 PARAM1.
       02 FILLER OCCURS 2. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 4. 
             05 ODSAMPLE-ARRAYTEST-PARAM1-V USAGE IS POINTER. 

     01 PARAM2-P. 
       02 FILLER OCCURS 2. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 4. 
             05 ODSAMPLE-ARRAYTEST-PARAM2-V USAGE IS POINTER. 
     01 PARAM2 USAGE POINTER. 
     01 PARAM3-P. 
       02 FILLER OCCURS 2. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 4. 
             05 ODSAMPLE-ARRAYTEST-PARAM3-V USAGE IS POINTER. 
     01 PARAM3 USAGE POINTER. 
     01 PARAM0-P. 
       02 FILLER OCCURS 2. 
         03 FILLER OCCURS 3. 
           04 FILLER OCCURS 4. 
             05 ODSAMPLE-ARRAYTEST-PARAM0-V USAGE IS POINTER. 
     01 PARAM0 USAGE POINTER.

  PROCEDURE DIVISION USING OBJ PARAM1 PARAM2 PARAM3 ENV PARAM0. 

  * outパラメタの処理
  CALL "ODSAMPLE-ARRAYTEST-STR-ALLOC" USING
       PARAM2. 

  SET ADDRESS  OF PARAM2-P TO PARAM2.
  PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 4

                     MOVE "str2[I][J][K]" TO STR-OUT

                     EVALUATE I
                       WHEN 1
                         INSPECT STR-OUT REPLACING ALL "I" BY "0" 
                       WHEN 2
                         INSPECT STR-OUT REPLACING ALL "I" BY "1" 
                     END-EVALUATE

                     EVALUATE J
                       WHEN 1
                         INSPECT STR-OUT REPLACING ALL "J" BY "0" 
                       WHEN  2
                         INSPECT STR-OUT REPLACING ALL "J" BY "1" 
                       WHEN  3
                         INSPECT STR-OUT REPLACING ALL "J" BY "2" 
                     END-EVALUATE

                     EVALUATE K
                       WHEN 1
                         INSPECT STR-OUT REPLACING ALL "K" BY "0" 
                       WHEN 2
                         INSPECT STR-OUT REPLACING ALL "K" BY "1" 
                       WHEN 3
                         INSPECT STR-OUT REPLACING ALL "K" BY "2" 
                       WHEN 4
                         INSPECT STR-OUT REPLACING ALL "K" BY "3" 
                     END-EVALUATE

                  MOVE FUNCTION LENG(STR-OUT) TO LSIZE

                  CALL "CORBA-STRING-SET" USING
                        ODSAMPLE-ARRAYTEST-PARAM2-V( I J K ) 
                        LSIZE 
                        STR-OUT

                END-PERFORM
         END-PERFORM
  END-PERFORM.

  * inoutパラメタの処理
  SET ADDRESS  OF PARAM3-P TO PARAM3.
  PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 4
                     CALL "CORBA-FREE" USING ODSAMPLE-ARRAYTEST-PARAM3-V( I J K )

                     MOVE "str3[I][J][K]" TO STR-IO

                     EVALUATE I
                       WHEN 1
                         INSPECT STR-IO REPLACING ALL "I" BY "0" 
                       WHEN 2
                         INSPECT STR-IO REPLACING ALL "I" BY "1" 
                     END-EVALUATE

                     EVALUATE J
                       WHEN 1
                         INSPECT STR-IO REPLACING ALL "J" BY "0" 
                       WHEN  2
                         INSPECT STR-IO REPLACING ALL "J" BY "1" 
                       WHEN  3
                         INSPECT STR-IO REPLACING ALL "J" BY "2" 
                     END-EVALUATE

                     EVALUATE K
                       WHEN 1
                         INSPECT STR-IO REPLACING ALL "K" BY "0" 
                       WHEN 2
                         INSPECT STR-IO REPLACING ALL "K" BY "1" 
                       WHEN 3
                         INSPECT STR-IO REPLACING ALL "K" BY "2" 
                       WHEN 4
                         INSPECT STR-IO REPLACING ALL "K" BY "3" 
                     END-EVALUATE

                  MOVE FUNCTION LENG(STR-IO) TO LSIZE

                  CALL "CORBA-STRING-SET" USING
                        ODSAMPLE-ARRAYTEST-PARAM3-V( I J K ) 
                        LSIZE 
                        STR-IO

                END-PERFORM
         END-PERFORM
  END-PERFORM.

* 復帰値の処理 
  CALL "ODSAMPLE-ARRAYTEST-STR-ALLOC" USING
       PARAM0. 

  SET ADDRESS  OF PARAM0-P TO PARAM0.
  PERFORM VARYING I FROM 1 BY 1 UNTIL I > 2
          PERFORM VARYING J FROM 1 BY 1 UNTIL J > 3
                PERFORM VARYING K FROM 1 BY 1 UNTIL K > 4

                     MOVE "str0[I][J][K]" TO STR-RET

                     EVALUATE I
                       WHEN 1
                         INSPECT STR-RET REPLACING ALL "I" BY "0" 
                       WHEN 2
                         INSPECT STR-RET REPLACING ALL "I" BY "1" 
                     END-EVALUATE

                     EVALUATE J
                       WHEN 1
                         INSPECT STR-RET REPLACING ALL "J" BY "0" 
                       WHEN  2
                         INSPECT STR-RET REPLACING ALL "J" BY "1" 
                       WHEN  3
                         INSPECT STR-RET REPLACING ALL "J" BY "2" 
                     END-EVALUATE

                     EVALUATE K
                       WHEN 1
                         INSPECT STR-RET REPLACING ALL "K" BY "0" 
                       WHEN 2
                         INSPECT STR-RET REPLACING ALL "K" BY "1" 
                       WHEN 3
                         INSPECT STR-RET REPLACING ALL "K" BY "2" 
                       WHEN 4
                         INSPECT STR-RET REPLACING ALL "K" BY "3" 
                     END-EVALUATE

                  MOVE FUNCTION LENG(STR-RET) TO LSIZE

                  CALL "CORBA-STRING-SET" USING
                        ODSAMPLE-ARRAYTEST-PARAM0-V( I J K ) 
                        LSIZE 
                        STR-RET

                  END-PERFORM
              END-PERFORM
          END-PERFORM.
      EXIT PROGRAM.
  END PROGRAM "ODSAMPLE-ARRAYTEST-OP2".

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005