11.2.6 bsearch,qsortのK&R形式の比較関数定義

bsearch,qsortの比較関数定義をK&R形式で記述した場合,bsearch,qsortの比較関数呼び出し側は実引数をnearポインタとして渡しますが,比較関数定義側は仮引数をfarポインタとして受け取るアセンブラコードを生成するため,プログラムは正しく動作しません。

#include <stdlib.h>
int table[5] = {0, 1, 2, 3, 4}, key = 3, *ret;
int compare();
 
void func(void) {
        ret = bsearch(&key, table, 5, sizeof(int), compare);
}
 
int compare(i, j)
int *i, *j;
{
        if (*i > *j) {
                return 1;
        }
        else if (*i < *j) {
                return -1;
        }
        return 0;
}

 

【回避策】

bsearch,qsortの比較関数の定義と宣言を関数原型形式で記述してください。

#include <stdlib.h>
int table[5] = {0, 1, 2, 3, 4}, key = 3, *ret;
int compare(int *, int *);      // 関数原型
 
void func(void) {
        ret = bsearch(&key, table, 5, sizeof(int), compare);
}
 
int compare(int *i, int *j)     // 関数原型
{
        if (*i > *j) {
                return 1;
        }
        else if (*i < *j) {
                return -1;
        }
        return 0;
}