| Interstage Application Server アプリケーション作成ガイド (CORBAサービス編) |
目次
索引
![]()
|
| 第5章 アプリケーションの開発(C++言語) | > 5.5 データ型に対するマッピング |
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 fix[4][3][2]; // 配列(固定長) typedef CORBA::Long fix_slice[4][3]; // 配列スライス(固定長) typedef CORBA::String_var str[2][3][4]; // 配列(可変長) typedef CORBA::String_var str_slice[2][3]; // 配列スライス(可変長)
配列(固定長)のパラメタ(in、out、inout)を扱う場合、宣言した配列変数をパラメタに指定します。復帰パラメタは、スタブで領域獲得された配列スライスで返されます。この領域はアプリケーションで不要になった時点でデータ域解放関数(XX_free関数)で解放する必要があります。
以下にクライアントアプリケーションでの処理例を示します。
CORBA::Environment env;
ODsample::arraytest_ptr obj;
ODsample::arraytest::fix_slice *fix0;
ODsample::arraytest::fix fix1, fix2, fix3;
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パラメタ
}
// サーバ呼出し
fix0 = obj->op1( fix1, fix2, fix3, env );
// 領域解放
ODsample::arraytest::fix_free(fix0);
配列(可変長)のin、inoutパラメタを扱う場合、宣言した配列変数をパラメタで指定します。out、復帰パラメタはスタブで領域獲得された配列スライスで返されます。この領域はアプリケーションで不要になった時点でデータ域解放関数(XX_free関数)で解放する必要があります。
以下にクライアントアプリケーションの処理例を示します。
CORBA::Environment env;
ODsample::arraytest_ptr obj;
ODsample::arraytest::str_slice *str0, *str2;
ODsample::arraytest::str str1, str3;
int i, j, k;
char buf[120];
for( i = 0; i < 2; i++ )
for( j = 0; j < 3; j++ )
for( k = 0; k < 4; k++ ) {
sprintf( buf, "str1[%d][%d][%d]", i, j, k );
str1[i][j][k] = (const CORBA::Char *)buf; // inパラメタ設定
sprintf( buf, "str3[%d][%d][%d]", i, j, k );
str3[i][j][k] = (const CORBA::Char *)buf; // inoutパラメタ設定
}
// サーバ呼出し
str0 = obj->op2( str1, str2, str3, env );
// 領域解放
ODsample::arraytest::str_free( str0 );
ODsample::arraytest::str_free( str2 );
配列(固定長)のパラメタ(in、out、inout)を扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out、inoutパラメタへのデータ設定は、その領域を用います。復帰パラメタについては、XX_alloc関数で領域を獲得し、その領域にデータを設定し返します。獲得した領域はスケルトンで解放されます。
以下にサーバアプリケーションの処理例を示します。
ODsample::arraytest::fix_slice *
ODsample_arraytest_impl::op1(
ODsample::arraytest::fix para1,
ODsample::arraytest::fix para2,
ODsample::arraytest::fix para3,
CORBA::Environment &env,
throw( CORBA::Exception )
{
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;
// 復帰パラメタ
ODsample::arraytest::fix_slice *fix = // 領域獲得
ODsample::arraytest::fix_alloc();
for( i = 0; i < 4; i++ )
for( j = 0; j < 3; j++ )
for( k = 0; k < 2; k++ )
fix[i][j][k] = i*j*k;
return( fix );
}
配列(可変長)のin、inoutパラメタを扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out、復帰パラメタについては、XX_alloc関数で配列スライスの領域を獲得し、その領域にデータを設定します。inoutパラメタにデータを設定する場合、新しいデータを代入することで古いデータ域は自動的に解放され、新しいデータ域に置き換わります。ここで獲得した領域はスケルトンで自動的に解放されます。
以下にサーバアプリケーションでの処理例を示します。
ODsample::arraytest::str_slice *
ODsample_arraytest_impl::op2(
ODsample::arraytest::str para1,
ODsample::arraytest::str_slice *¶2,
ODsample::arraytest::str para3,
CORBA::Environment &env,
throw( CORBA::Exception )
{
int i, j, k;
char buf[120];
// outパラメタ
para2 = ODsample::arraytest::str_alloc(); // 領域獲得
for( i = 0; i < 2; i++ ) // パラメタ設定
for( j = 0; j< 3; j++ )
for( k = 0; k < 4; k++ ){
sprintf( buf, "str2[%d][%d][%d]", i, j, k );
para2[i][j][k] = (const CORBA::Char *)buf;
}
// inoutパラメタ
for( i = 0; i < 2; i++ ) // パラメタ設定
for( j = 0; j < 3; j++ )
for( k = 0; k < 4; k++ ){
sprintf( buf, "str3[%d][%d][%d]", i, j, k );
para3[i][j][k] = (const CORBA::Char *)buf; // 新データ代入
}
// 復帰パラメタ
ODsample::arraytest::str_slice *str =
ODsample::arraytest::str_alloc();
for( i = 0; i < 4; i++ )
for( j = 0; j < 3; j++ )
for( k = 0; k < 2; k++ ){
sprintf( buf, "str[%d][%d][%d]", i, j, k );
str[i][j][k] = (const CORBA::Char *)buf;
}
return( str );
}
目次
索引
![]()
|