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

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

7.5.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.

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

Copyright 2006 FUJITSU LIMITED