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関数で異常終了。