ページの先頭行へ戻る
Interstage Business Application Server アプリケーション開発ガイド
FUJITSU Software

13.6.3 配列について

配列を使用する際、固定長データの場合と可変長データの場合でデータの扱い方が異なります。

固定長データ

配列(固定長)を扱う場合のサーバアプリケーションについて以下に示します。
なお、固定長の配列とは、メンバに以下のデータを含まない配列です。

IDLファイル定義例
typedef  long  server_array_fix[5][3];
module apfwmod {
    interface apfwinf {
        server_array_fix server_apl(
             in server_array_fix param_in,        /* INパラメタ */
             out server_array_fix param_out,      /* OUTパラメタ */
             inout server_array_fix param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
typedef  int  server_array_fix[5][3];

server_array_fix*
server_apl(
  server_array_fix    *param_in,         /* INパラメタ */
  server_array_fix    **param_out,       /* OUTパラメタ */
  server_array_fix    **param_inout,     /* INOUTパラメタ */
  int                 *rtn,              /* 処理結果情報 */
  apfwExcept          *apfw_env );       /* 例外情報 */
パラメタの扱い

パラメタ

アプリケーション連携実行基盤から
渡されたパラメタ

アプリケーション連携実行基盤へ
渡すパラメタ

IN

  • 使用しないパラメタの場合
    NULLポインタとして渡されます。

  • 使用するパラメタの場合
    配列領域のアドレスが渡されます。配列領域はC言語実行基盤インタフェースで自動的に獲得、および解放されます。

OUT

NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    パラメタには何も設定せず、NULLポインタのまま返却します。

  • データを設定する場合
    配列領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスをパラメタに設定して返却します。
    なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。

INOUT

  • 使用しないパラメタの場合
    NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    渡されたパラメタの値がNULLポインタの場合、パラメタには何も設定せず、NULLポインタのまま返却します。
    渡されたパラメタの値がNULLポインタ以外の場合、パラメタの配列領域をapfw_c_free()で解放後、パラメタにNULLポインタを設定して返却してください。

  • 使用するパラメタの場合
    配列領域のアドレスを値として持つ変数のアドレスが渡されます。配列領域はC言語実行基盤インタフェースで自動的に獲得、および解放されますが、必要に応じてアプリケーションで解放することもできます。

  • データを設定する場合
    渡されたパラメタがNULLポインタの場合、配列領域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスはパラメタに設定して返却します。なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。
    渡されたパラメタがNULLポインタ以外の場合、渡された領域をそのまま使用します。

復帰

  • データの設定を省略する場合
    関数の復帰値としてNULLを返却します。

  • データを設定する場合
    配列領域をapfw_c_alloc()で獲得して使用します。
    獲得した領域のアドレスを関数の復帰値として返却します。なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。

サーバアプリケーションの記述例
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

#include "XXXXXX.h" /* 実行基盤インタフェース生成ツールより生成されるヘッダファイル */

server_array_fix*
server_apl(
  server_array_fix    *param_in,         /* INパラメタ */
  server_array_fix    **param_out,       /* OUTパラメタ */
  server_array_fix    **param_inout,     /* INOUTパラメタ */
  int                 *rtn,              /* 処理結果情報 */
  apfwExcept          *apfw_env )        /* 例外情報 */
{
  server_array_fix    *apfw_result = NULL;     	/* アプリケーションの復帰値 */
  server_array_fix    work_param_out;
  server_array_fix    work_param_inout;
  server_array_fix    work_ret;
  int                 i,j;

/* OUTパラメタ */
  *param_out = apfw_c_alloc(sizeof(server_array_fix));
  if( *param_out == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  for(i=0;i<5;i++){
    for(j=0;j<3;j++){
      work_param_out[i][j] = i+j;
    }
  }
  memcpy(*param_out,work_param_out,sizeof(server_array_fix));

/* INOUTパラメタ */
  if( *param_inout == NULL ){
    *param_inout = apfw_c_alloc(sizeof(server_array_fix));
    if( *param_inout == NULL ){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
  }
  for(i=0;i<5;i++){
    for(j=0;j<3;j++){
      work_param_inout[i][j] = i+j;
    }
  }
  memcpy(*param_inout,work_param_inout,sizeof(server_array_fix));

/* 復帰情報 */
  apfw_result = apfw_c_alloc(sizeof(server_array_fix));
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  for(i=0;i<5;i++){
    for(j=0;j<3;j++){
      work_ret[i][j] = i+j;
    }
  }
  memcpy(apfw_result,work_ret,sizeof(server_array_fix));

  *rtn = APFW_RTN_COMMIT;   /* 処理結果情報に正常(APFW_RTN_COMMIT)を設定 */

  return( apfw_result );
}

可変長データ

配列(可変長)を扱う場合のサーバアプリケーション例を以下に示します。
なお、可変長の配列とは、メンバに以下のデータを含む配列です。

IDLファイル定義例
typedef string server_array_var[2];

module apfwmod {
    interface apfwinf {
        server_array_var server_apl(
             in server_array_var param_in,        /* INパラメタ */
             out server_array_var param_out,      /* OUTパラメタ */
             inout server_array_var param_inout   /* INOUTパラメタ */
        );
    };
};
サーバアプリケーションインタフェース定義例
typedef char *server_array_var[2];

server_array_var*
server_apl(
  server_array_var    *param_in,         /* INパラメタ */
  server_array_var    **param_out,       /* OUTパラメタ */
  server_array_var    **param_inout,     /* INOUTパラメタ */
  int                 *rtn,              /* 処理結果情報 */
  apfwExcept          *apfw_env );       /* 例外情報 */
パラメタの扱い

パラメタ

アプリケーション連携実行基盤から
渡されたパラメタ

アプリケーション連携実行基盤へ
渡すパラメタ

IN

  • 使用しないパラメタの場合
    NULLポインタとして渡されます。

  • 使用するパラメタの場合
    配列領域のアドレスが渡されます。配列領域はC言語実行基盤インタフェースで自動的に獲得、および解放されます。

OUT

NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    パラメタには何も設定せず、NULLポインタのまま返却します。

  • データを設定する場合
    配列領域をapfw_c_alloc()で獲得し、可変長データ域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスをパラメタに設定して返却します。
    なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。

INOUT

  • 使用しないパラメタの場合
    NULLポインタを値として持つ変数のアドレスが渡されます。

  • データの設定を省略する場合
    渡されたパラメタの値がNULLポインタの場合、パラメタには何も設定せず、NULLポインタのまま返却します。
    渡されたパラメタがNULLポインタ以外の場合、可変長データ域をapfw_c_free()で解放、および配列領域をapfw_c_free()で解放し、NULLポインタを設定して返却してください。

  • 使用するパラメタの場合
    配列領域のアドレスを値として持つ変数のアドレスが渡されます。配列領域はC言語実行基盤インタフェースで自動的に獲得、および解放されますが、必要に応じてアプリケーションで解放することもできます。

  • データを設定する場合
    渡されたパラメタがNULLポインタの場合、配列領域をapfw_c_alloc()で獲得し、可変長データ域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスはパラメタに設定して返却します。
    なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。
    渡されたパラメタがNULLポインタ以外の場合、可変長データ域をapfw_c_free()で解放し、apfw_c_alloc()で可変長データ域を再度領域獲得して使用します。

復帰

  • データの設定を省略する場合
    関数の復帰値としてNULLを返却します。

  • データを設定する場合
    配列領域をapfw_c_alloc()で獲得し、可変長データ域をapfw_c_alloc()で獲得して使用します。獲得した領域のアドレスを関数の復帰値として返却します。
    なお、獲得した配列領域はC言語実行基盤インタフェースで自動的に解放されます。

サーバアプリケーションの記述例
#include "apfwcom.h"
#include "apfw_cdr_lib.h"

#include "XXXXXX.h" /* 実行基盤インタフェース生成ツールより生成されるヘッダファイル */

server_array_var*
server_apl(
  server_array_var  *param_in,       /* INパラメタ */
  server_array_var **param_out,      /* OUTパラメタ */
  server_array_var **param_inout,    /* INOUTパラメタ */
  int               *rtn,            /* 処理結果情報 */
  apfwExcept        *apfw_env )      /* 例外情報 */
{
  server_array_var *apfw_result = NULL;  /* アプリケーションの復帰値 */
  server_array_var work_param_out;
  server_array_var work_param_inout;
  server_array_var work_ret;
  int i;

/* OUTパラメタ */
  *param_out = apfw_c_alloc(sizeof(server_array_var));
  if( *param_out == NULL){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  for(i=0;i<2;i++){
    work_param_out[i] = apfw_c_alloc(10);
    if( work_param_out[i] == NULL ){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
    strcpy( work_param_out[i], "OUT DATA" );
  }
  memcpy(*param_out,work_param_out,sizeof(server_array_var));

/* INOUTパラメタ */
  if( *param_inout != NULL ){
    memcpy(work_param_inout,*param_inout,sizeof(server_array_var));
    for(i=0;i<2;i++){
      if( work_param_inout[i] != NULL )
        apfw_c_free(work_param_inout[i]);
      }
    }
  else{
    *param_inout = apfw_c_alloc(sizeof(server_array_var));
    if( *param_inout == NULL){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
  }
  for(i=0;i<2;i++){
    work_param_inout[i] = apfw_c_alloc(10);
    if( work_param_inout[i] == NULL ){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
    strcpy( work_param_inout[i], "IO DATA" );
  }
  memcpy(*param_inout,work_param_inout,sizeof(server_array_var));

/* 復帰情報 */
  apfw_result = apfw_c_alloc(sizeof(server_array_var));
  if( apfw_result == NULL ){
    *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
    apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
    return( NULL );
  }
  for(i=0;i<2;i++){
    work_ret[i] = apfw_c_alloc(10);
    if( work_ret[i] == NULL ){
      *rtn = APFW_RTN_ERROR;  /* 処理結果情報に異常または例外(APFW_RTN_ERROR)を設定 */
      apfw_env->errcode = -1; /* 例外情報のエラーコードに値を設定 */
      return( NULL );
    }
    strcpy( work_ret[i], "PROC END" );
  }
  memcpy(apfw_result,work_ret,sizeof(server_array_var));

  *rtn = APFW_RTN_COMMIT;	/* 処理結果情報に正常(APFW_RTN_COMMIT)を設定 */

  return( apfw_result );
}