(1)IDLマッピング
IDL言語で配列を指定すると、C言語でも配列にマッピングされます。また、配列スライス(配列の先頭の次元を減らしたもの。名前は“モジュール名_インタフェース名_配列名_slice”)と配列スライスの領域獲得関数(関数名:“モジュール名_インタフェース名_配列名_alloc”。以降XX_alloc関数と呼ぶ)が生成されます。
以降では、以下の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 ); }; };
typedef CORBA_long ODsample_arraytest_fix[4][3][2]; /* 配列(固定長) */ typedef CORBA_long ODsample_arraytest_fix_slice[3][2]; /* 配列スライス */ typedef CORBA_char *ODsample_arraytest_str[2][3][4]; /* 配列(可変長) */ typedef CORBA_char *ODsample_arraytest_str_slice[3][4]; /* 配列スライス */
(2)クライアントアプリケーションで扱うパラメタ(固定長)
配列(固定長)のパラメタ(in、out、inout)を扱う場合、宣言した配列変数をパラメタに指定します。復帰パラメタは、スタブで領域獲得された配列スライスで返されます。この領域は、アプリケーションで不要になった時点でCORBA_free()で解放する必要があります。
クライアントアプリケーションでの処理例を以下に示します。
ODsample_arraytest_fix fix1, fix2, fix3; ODsample_arraytest_fix_slice *ret; CORBA_Object obj; CORBA_Environment env; int i, j, k; for( i = 0; i < 4; i++ ) for( j = 0; j < 3; j++ ) for( k = 0; k < 2; k++ ){ fix1[i][j][k] = i; /* inパラメタ */ fix3[i][j][k] = i*10; /* inoutパラメタ */ } /* サーバ呼出し */ ret = ODsample_arraytest_op1( obj, fix1, fix2, fix3, &env ); /* 領域解放 */ CORBA_free( ret ); /* 復帰パラメタ */
(3)クライアントアプリケーションで扱うパラメタ(可変長)
配列(可変長)のin/inoutパラメタを扱う場合、配列変数をパラメタで指定します。out/復帰パラメタは、スタブで領域獲得された配列スライスに返されます。この領域は、アプリケーションで不要になった時点でCORBA_free()で解放する必要があります。
ODsample_arraytest_str str1, str3; ODsample_arraytest_str_slice *str2, *ret; CORBA_Object obj; CORBA_Environment env; int i, j, k; CORBA_string buf[]; for( i = 0; i < 2; i++ ) for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ) { /* inパラメタ */ sprintf( buf, "str1[i][j][k]", i, j, k ); str1[i][j][k] = CORBA_string_alloc(strlen(buf)); strcpy( str1[i][j][k], buf ); /* inoutパラメタ */ sprintf( buf, "str3[i][j][k]", i, j, k ); str3[i][j][k] = CORBA_string_alloc(strlen(buf)); strcpy( str3[i][j][k], buf ); } ret = ODsample_arraytest_op2( obj, str1, &str2, str3, &env ); /* 領域解放 */ for( i = 0; i < 2; i++ ) for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ) { CORBA_free(str1[i][j][k]); /* inパラメタ */ CORBA_free(str3[i][j][k]); /* inoutパラメタ */ } CORBA_free( ret ); /* 復帰パラメタ */ CORBA_free( str2 ); /* outパラメタ */
(4)サーバアプリケーションで扱うパラメタ(固定長)
配列(固定長)のパラメタ(in、out、inout)を扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out/inoutパラメタへのデータ設定は、その領域を使用します。復帰パラメタについては、XX_alloc関数で領域を獲得し、その領域にデータを設定し返します。獲得した領域は、スケルトンで解放されます。
サーバアプリケーションの処理例を以下に示します。
ODsample_arraytest_fix_slice *ODsample_arraytest_op1( ODsample_arraytest obj, ODsample_arraytest_fix para1, ODsample_arraytest_fix para2, ODsample_arraytest_fix para3, CORBA_Environment *env ) { ODsample_arraytest_fix_slice *para; int i, j, k; /* outパラメタ */ for( i = 0; i < 4; i++ ) /* データ設定 */ for( j = 0; j < 3; j++ ) for( k = 0; k < 2; k++ ) para2[i][j][k] = i+j+k; /* inoutパラメタ */ for( i = 0; i < 4; i++ ) /* データ設定 */ for( j = 0; j < 3; j++ ) for( k = 0; k < 2; k++ ) para3[i][j][k] = (i+j+k)*10; /* 復帰パラメタ */ para = ODsample_arraytest_fix_alloc(); /* 領域獲得 */ for( j = 0; j < 3; j++ ) /* データ設定 */ for( k = 0; k < 2; k++ ) para[j][k] = j*k; return( para ); }
(5)サーバアプリケーションで扱うパラメタ(可変長)
配列(可変長)のin/inoutパラメタを扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out/復帰パラメタについては、XX_alloc関数で配列スライスの領域を獲得し、その領域にデータを設定します。inoutパラメタの領域を拡張する場合は、一度CORBA_free()でデータ域を解放し、再度領域を獲得します。ここで獲得した領域は、スケルトンで自動的に解放されます。
サーバアプリケーションでの処理例を以下に示します。
ODsample_arraytest_str_slice *ODsample_arraytest_op2( CORBA_Object obj, ODsample_arraytest_str para1, ODsample_arraytest_str_slice **para2, ODsample_arraytest_str para3, CORBA_Environment *env ) { CORBA_string str; ODsample_arraytest_str_slice *para; int i, j, k; char buf[120]; /* outパラメタ */ *para2 = ODsample_arraytest_str_alloc(); /* 領域獲得 */ for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ){ sprintf(buf, "(*para2)[%d][%d]", j, k ); (*para2)[j][k] = CORBA_string_alloc(strlen(buf)); strcpy( (*para2)[j][k], buf ); } /* inoutパラメタ */ for( i = 0; i < 2; i++ ) /* 領域解放 */ for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ) CORBA_free( para3[i][j][k] ); for( i = 0; i < 2; i++ ) for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ) { sprintf(buf, "para3[%d][%d][%d]", i, j, k ); para3[i][j][k] = CORBA_string_alloc(strlen(buf)); /* 領域再獲得 */ strcpy( para3[i][j][k], buf ); } /* 復帰パラメタ */ para = ODsample_arraytest_str_alloc(); /* 領域獲得 */ for( j = 0; j < 3; j++ ) for( k = 0; k < 4; k++ ) { sprintf(buf, "para[%d][%d]", j, k ); para[j][k] = CORBA_string_alloc(strlen(buf)); strcpy( para[j][k], buf ); } return( para ); }