PowerSORT Workstation V5.0 使用手引書
目次 索引 前ページ次ページ

付録A 使用例

A.3 BSORT関数の使用例

BSORT関数の使用例を説明します。
この例では、テキストファイルからレコードを入力し、ソート結果を出力ファイルに出力します。C言語のライブラリ関数、システムコールに対するエラー判定は行っていないため、このような関数でエラーが発生した場合、本プログラムの動作は保証されません。
なお、この使用例は、製品のインストールフォルダの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. 使用例で設定する情報は以下に示すものです。なお、これらの領域は必ず初期化してから使用してください。
  2. テキストファイル処理時の注意を示します。
  3. ファイル数が1つなので、BS_FILESIZEマクロのパラメタ値は1です。
    複数個指定する場合はその数を指定します。PowerSORTでは、複数の入力ファイルと1つの出力ファイルを指定できます。
  4. キーフィールドの数が1つなので、BS_KEYTABSIZEマクロのパラメタ値は1です。
    複数個指定する場合はその数を指定します。
  5. 本使用例の処理では、入出力ファイルを指定しているため、レコードの入出力処理はPowerSORTが行います。したがって、ユーザアプリケーションは、bsrtopen関数とbsrtclse関数だけを発行します。
  6. bsrtopen関数の復帰値には、0、-1および-2があります。
    それぞれの値の意味は以下のとおりです。
  7. bsrtclse関数の復帰値には、0、1および-1があります。
    それぞれの値の意味は以下のとおりです。

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

All Rights Reserved, Copyright(C) 富士通株式会社 2004-2006