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; /* 正常終了 */
}以下は、上記使用例内の括弧付き数字に対応します。
使用例で設定する情報は以下に示す構造体です。なお、これらの構造体は必ず初期化してから使用してください。
BSRTPRIM:主要情報
BSRTFILE:ファイル情報
BSRTOPT:オプション情報(初期化のみ)
BSRTKEY:キー情報
BSRTREC:レコード情報(初期化のみ)
BSRTFUNC:その他(初期化のみ)
テキストファイル処理時の注意事項を以下に記載します。
レコード長(prim.rec_len)には、最大レコード長を指定します。
テキストファイルの場合の最大レコード長とは、改行コードを含んだ最大行長をいいます。
フィールドの指定(prim.fieldmode)を必ず指定します。
prim.fieldmodeにBS_FLTFLD(浮動フィールド指定)を指定している場合、フィールド分離文字列(prim.fldchar_addr)の指定が可能になります。フィールド分離文字列の指定を省略すると、空白、およびタブがフィールド分離文字となります。
入力ファイルが1つのため、BS_FILESIZEマクロのパラメタ値は1です。
複数指定する場合はその数を指定します。PowerSORTでは、複数の入力ファイルと1つの出力ファイルを指定できます。
キーフィールドの数が1つのため、BS_KEYTABSIZEマクロのパラメタ値は1です。
複数指定する場合はその数を指定します。
本使用例の処理では、入出力ファイルを指定しているため、レコードの入出力処理はPowerSORTが行います。したがって、ユーザアプリケーションは、bsrtopen関数とbsrtclse関数だけを発行します。
bsrtopen関数の復帰値には、0、-1、および-2があります。
それぞれの値の意味は以下のとおりです。
0 : bsrtopen関数は正常終了(bsrtclse関数を発行する必要があります)。
-1 : bsrtopen関数で実行環境構築後にエラー発生(bsrtclse関数を発行する必要があります)。
-2 : bsrtopen関数で実行環境構築前にエラー発生(bsrtclse関数を発行する必要はありません)。
bsrtclse関数の復帰値には、0、1、および-1があります。
それぞれの値の意味は以下のとおりです。
0 : bsrtclse関数は正常終了。
1 : bsrtclse関数は正常に中断処理を終了。
-1 : bsrtclse関数で異常終了。