ページのトップに戻る
PowerSORT V6.0  ユーザーズガイド

A.3 BSORT関数の使用例

BSORT関数の使用例を説明します。
この例では、テキストファイルからレコードを入力し、ソート結果を出力ファイルに出力します。ライブラリ関数等に対するエラー判定は行っていないため、このような関数でエラーが発生した場合、本プログラムの動作は保証されません。
なお、この使用例は、製品のインストールフォルダのSAMPLES¥c¥sample7.cとして添付されています。

/* ヘッダーファイルの宣言 */
#include "sample.h"
#include "bsrt.h"                /* 共通定義ファイルの宣言 */
#include <memory.h>
#include <malloc.h>
#include <stdlib.h>

/* DLLの呼び出しに使用する構造体変数の宣言 */
BSRTFUNC        func;            /* 関数アドレス格納領域の宣言 */
BSRTPRIM        prim;            /* 主要情報テーブル領域の宣言 */
BSRTREC         rec;             /* レコード情報領域の宣言 */
BSRTFILE        file;            /* ファイル情報領域の宣言 */
BSPTR_BSRTKEY   key;             /* キー情報領域の宣言 */
BSRTOPT         opt;             /* オプション情報領域の宣言 */

int sample()
{
  int      rcd;                    /* 関数復帰値 */
  HGLOBAL  hHdlFile;               /* 入力ファイルテーブル領域ハンドル */
  HGLOBAL  hHdlKey;                /* キーテーブル領域ハンドル */
  char     szStr[80];              /* エラー詳細コード表示用領域 */

  /* bsrtopen関数の引数情報設定・・・(1) */

  /* BSRTPRIMの設定処理・・・(2) */
  memset(&prim, 0x00, sizeof(BSRTPRIM));     /* BSRTPRIM(prim)領域の初期化 */
  prim.function   = BS_SORT;                 /* ソート機能 */
  prim.optionfunc = 0;                       /* レコード処理指定なし */
  prim.msglevel   = BSMSG_LEVEL0;            /* 処理情報を出力しない */
  prim.cdmode     = BSZD_AU;                 /* 入力データのコード系はASCII */
  prim.chklevel   = BSCHK_LEVEL0;            /* BSORT関数のチェックをしない */
  prim.rec_len    = 15;                      /* レコード長は15バイト */
  prim.fieldmode  = BS_FLTFLD;               /* 浮動フィールド指定 */

  /* BSRTFILEの設定処理 */
  memset(&file, 0x00, sizeof(BSRTFILE));     /* BSRTFILE(file)領域の初期化 */

  /* 入力ファイルテーブル領域の確保・・・(3) */
  hHdlFile = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, BS_FILESIZE(1));
  file.inpfile_tbl = (BSPTR_BSFILE)GlobalLock((HGLOBAL)hHdlFile);
  file.inpfile_tbl->entry_no = 1;            /* 入力ファイル数は1個 */
  file.inpfile_tbl->file_addr[0] = (BSPTR_UCHAR)"sortin.txt";
                                             /* ファイル名はsortin.txt */

  /* 出力ファイル名の指定(ファイル名をポイントするアドレスを指定) */
  file.outfile_addr = (BSPTR_UCHAR)"sortout.txt";
                                             /* ファイル名はsortout.txt */

  /* キーテーブル領域の確保・・・(4) */
  hHdlKey = GlobalAlloc(GMEM_MOVEABLE | GMEM_ZEROINIT, BS_KEYTABSIZE(1));
  key = (BSPTR_BSRTKEY)GlobalLock((HGLOBAL)hHdlKey);
                                             /* キーテーブル領域の確保 */
  memset(key, 0x00, BS_KEYTABSIZE(1));       /* BSRTKEY(key)領域の初期化 */

  /* BSRTKEYの設定処理 */
  key->entry_no                  = 1;          /* キーの個数は1個 */
  key->key_entry[0].key_position = 0;          /* 比較位置は第1フィールド */
  key->key_entry[0].key_length   = 4;          /* キー長は4バイト */
  key->key_entry[0].key_type     = BSKEY_ASC;  /* データ形式はASCII文字 */
  key->key_entry[0].key_order    = BS_ASCND;   /* 昇順に並べる */

  /* BSRTRECの設定処理(初期化) */
  memset(&rec, 0x00, sizeof(BSRTREC));       /* BSRTREC(rec)領域の初期化 */

  /* BSRTOPTの設定処理(初期化) */
  memset(&opt, 0x00, sizeof(BSRTOPT));       /* BSRTOPTの設定処理(初期化) */

  /* bsrtopen関数の発行・・・(5) */
  rcd = bsrtopen(BSRTVL, &func, &prim, &rec, key, &file, &opt);

  /* bsrtopen関数の復帰値・・・(6) */
  if(rcd != 0)                               /* エラーの表示例 */
  {
    wsprintf((LPSTR)szStr, "bsrtopen関数で詳細コード %d のエラーが発生しました.",rec.errdetail);
    MessageBox(NULL, szStr, "PowerSORT 関数呼び出しサンプル", MB_OK | MB_ICONSTOP);
  }

  if(rcd == -1)                    /* bsrtopen関数実行環境構築後にエラー発生 */
  {
    bsrtclse(BSRTVL, &func, &prim, &rec);
    GlobalUnlock((HGLOBAL)hHdlKey);
    GlobalFree((HGLOBAL)hHdlKey);
    GlobalUnlock((HGLOBAL)hHdlFile);
    GlobalFree((HGLOBAL)hHdlFile);
    return -1;
  }
  else if(rcd == -2)               /* bsrtopen関数実行環境構築前にエラー発生 */
  {
    GlobalUnlock((HGLOBAL)hHdlKey);
    GlobalFree((HGLOBAL)hHdlKey);
    GlobalUnlock((HGLOBAL)hHdlFile);
    GlobalFree((HGLOBAL)hHdlFile);
    return -1;
  }

  /* bsrtclse関数の発行 */
  rcd = bsrtclse(BSRTVL, &func, &prim, &rec);

  /* bsrtclse関数の復帰値・・・(7) */
  if(rcd == -1)                    /* bsrtclse関数でエラー発生 */
  {
    GlobalUnlock((HGLOBAL)hHdlKey);
    GlobalFree((HGLOBAL)hHdlKey);
    GlobalUnlock((HGLOBAL)hHdlFile);
    GlobalFree((HGLOBAL)hHdlFile);
    return -2;
  }

  GlobalUnlock((HGLOBAL)hHdlKey);
  GlobalFree((HGLOBAL)hHdlKey);
  GlobalUnlock((HGLOBAL)hHdlFile);
  GlobalFree((HGLOBAL)hHdlFile);
  return 0;                        /* 正常終了 */
}

上記使用例の括弧付き数字は、以下の数字と対応しています。

  1. 使用例で設定する情報は以下に示すものです。なお、これらの領域は必ず初期化してから使用してください。

    • BSRTPRIM:主要情報

    • BSRTFILE:ファイル情報

    • BSRTOPT:オプション情報(初期化のみ)

    • BSRTKEY:キー情報

    • BSRTREC:レコード情報(初期化のみ)

    • BSRTFUNC:その他(初期化のみ)

  2. テキストファイル処理時の注意を示します。

    • レコード長(prim.rec_len)には、最大レコード長を指定します。
      テキストファイルの場合の最大レコード長とは、改行コードを含んだ最大行長のことをいいます。

    • フィールドの指定(prim.fieldmode)を必ず指定します。

    • prim.fieldmodeにBS_FLTFLD(浮動フィールド指定)を指定している場合、浮動フィールド指定だけに有効なフィールド分離文字(prim.fldchar_addr)が指定可能になります。フィールド分離文字の指定を省略すると、空白とタブがフィールド分離文字となります。

  3. ファイル数が1つなので、BS_FILESIZEマクロのパラメタ値は1です。
    複数個指定する場合はその数を指定します。PowerSORTでは、複数の入力ファイルと1つの出力ファイルを指定できます。

  4. キーフィールドの数が1つなので、BS_KEYTABSIZEマクロのパラメタ値は1です。
    複数個指定する場合はその数を指定します。

  5. 本使用例の処理では、入出力ファイルを指定しているため、レコードの入出力処理はPowerSORTが行います。したがって、ユーザアプリケーションは、bsrtopen関数とbsrtclse関数だけを発行します。

  6. bsrtopen関数の復帰値には、0、-1、および-2があります。
    それぞれの値の意味は以下のとおりです。

    • 0 : bsrtopen関数は正常終了(bsrtclse関数を発行する必要があります)。

    • -1 : bsrtopen関数で実行環境構築後にエラー発生(bsrtclse関数を発行する必要があります)。

    • -2 : bsrtopen関数で実行環境構築前にエラー発生(bsrtclse関数を発行する必要はありません)。

  7. bsrtclse関数の復帰値には、0、1、および-1があります。
    それぞれの値の意味は以下のとおりです。

    • 0 : bsrtclse関数は正常終了。

    • 1 : bsrtclse関数は正常に中断処理を終了。

    • -1 : bsrtclse関数で異常終了。