| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第4章 アプリケーションの開発(C言語) | > 4.7 データ型に対するマッピング |
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]; /* 配列スライス */
配列(固定長)のパラメタ(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 ); /* 復帰パラメタ */
配列(可変長)の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パラメタ */
配列(固定長)のパラメタ(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 );
}
配列(可変長)の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 );
}
目次
索引
![]()
|