Interstage Application Server アプリケーション作成ガイド (CORBAサービス編)
目次 索引 前ページ次ページ

第5章 アプリケーションの開発(C++言語)> 5.5 データ型に対するマッピング

5.5.8 配列

(1)IDLマッピング

 IDL言語で配列を指定すると、C++言語でも配列にマッピングされます。また、配列スライス(配列の先頭の次元を減らしたもの。名前は"モジュール名::インタフェース名::配列名_slice")と配列スライスの領域獲得関数(関数名は"モジュール名::インタフェース名::配列名_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 ); 
      };
  };

C++言語

  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];    // 配列スライス(可変長)

(2)クライアントアプリケーションで扱うパラメタ(固定長)

 配列(固定長)のパラメタ(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);

(3)クライアントアプリケーションで扱うパラメタ(可変長)

 配列(可変長)の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 );

(4)サーバアプリケーションで扱うパラメタ(固定長)

 配列(固定長)のパラメタ(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 ); 
  }

(5)サーバアプリケーションで扱うパラメタ(可変長)

 配列(可変長)のin、inoutパラメタを扱う場合、配列領域はスケルトンで自動的に獲得/解放されます。out、復帰パラメタについては、XX_alloc関数で配列スライスの領域を獲得し、その領域にデータを設定します。inoutパラメタにデータを設定する場合、新しいデータを代入することで古いデータ域は自動的に解放され、新しいデータ域に置き換わります。ここで獲得した領域はスケルトンで自動的に解放されます。
 以下にサーバアプリケーションでの処理例を示します。

  ODsample::arraytest::str_slice *
  ODsample_arraytest_impl::op2(
      ODsample::arraytest::str        para1, 
      ODsample::arraytest::str_slice  *&para2, 
      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 ); 
  }

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2005