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;
}
|