Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]() ![]() |
第7章 アプリケーションの開発(COBOL) | > 7.5 データ型に対するマッピング |
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.
配列(固定長)の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.
配列(可変長)の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.
目次
索引
![]() ![]() |