Riverside Learning LABO(Skill/Idea/Code)

よりよいシステムのため工学系と人間系の学習下書きメモ

bsearch対応

                                                                                                                          • -

bsearch変更対応のSampleソース

■共通定義
[構造体]
#define G_MAX_COUNT 999 /* 最大数 */
typedef struct
{
char CDCO_[12]; /* ( 12) 会社コード */
char CDENGITM[16]; /* ( 16) 英字項目名 */
short int KILV; /* ( 2) 世代区分 */
char NMJPNITM[32]; /* ( 32) 日本語項目名 */



}
UtItemDef01;

[変数宣言]
pItemInfo :UtItemDef01構造体配列の先頭ポインタ
cdengitm  :char配列の先頭ポインタ

■修正前
[bsearch未使用時のソース]
/* 英字項目名をキーにマスタ情報を検索 */
for (i = 0; i < G_MAX_COUNT; i++, pItemInfo++)
/* 項目情報の項目数分ループ */
{
if (!memcmp(pItemInfo->cdengitm, cdengitm, strlen(cdengitm)))
break;
}

/* 見つからなければエラー */
if( i == G_MAX_COUNT )
{
エラー処理関数
goto ERR_RTN;
}
↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
■修正後
以下を追加.
[プロトタイプ宣言]
static int compItemDef(const void *v1, const void *v2);

[比較関数]
static int compItemDef(const void *v1, const void *v2)
{
const char *searchKey = (const char *)v1;
const UtItemDef01 *p2 = (const UtItemDef01 *)v2;

/* 英字項目名の比較結果を返す */
return memcmp(searchKey, p2->CDENGITM, 16);
}

[変数宣言]
UtItemDef01 *pItemDef01=NULL;/* マスタ情報 */

以下の通り修正
[bsearch使用時のソース]
/* 英字項目名をキーにマスタ情報を検索 */
/* 構造体ポインタ = bsearch(検索文字列, 検索対象の構造体配列リスト, 構造体配列数,sizeof(構造体), 比較関数); */
pItemDef01 = bsearch(cdengitm, pItemInfo, G_MAX_COUNT,sizeof(UtItemDef01), compItemDef);
if(pItemDef01 == NULL){
エラー処理関数
goto ERR_RTN;
}