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

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

4.7.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  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 ); 
  }

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

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