(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".