(1)IDLマッピング
IDL言語で配列を指定した場合、COBOLのOCCURS句でデータ宣言します。配列名は“モジュール名-インタフェース名-配列名-V”となり、用途に応じてCOPY文で定義します。配列のインデックスは、1から始まり<配列の大きさ>までとなります。また、配列の領域獲得関数(関数名:“モジュール名-インタフェース名-配列名-ALLOC”、以降XX-ALLOC関数と呼ぶ)が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 ); }; };
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".