stdlib qsort 对指向结构的指针数组进行排序
stdlib qsort to sort an array of pointers to a struct
我正在尝试根据存储在 "bucket" 结构的 void* 中的值对指向结构(下面的定义)的指针数组进行排序,我知道它是整数。它编译并打印出我的桶数组及其值,没有错误或警告,但它实际上并没有对数组进行排序。我已经使用断言来尝试查找可能导致 qsort 错误的任何地方。
结构定义:
typedef struct _bucket{
void* val;
char *word;
}bucket;
typedef struct _root{
bucket **list;
int hashTableLength;
}root;
要传递给 qsort 函数的排序函数:
int sortFunc(const void *a, const void *b){
bucket *bucketA=(bucket*)a;
bucket *bucketB=(bucket*)b;
int bucketAVal = *((int*)bucketA->val);
int bucketBVal = *((int*)bucketB->val);
assert((bucketAVal&&bucketBVal)!=0);
return bucketAVal-bucketBVal;
}
排序数组并打印:
void sort(root* inRoot, int(*sortFunc)(const void *a, const void *b)){
int length = inRoot->hashTableLength;
assert(length==11); //known length of hash array
for (int i = 0; i<length; i++)
assert(inRoot->list[i] != NULL);
qsort(inRoot->list, length, sizeof(bucket*), sortFunc);
for(int i =0; i<length; i++)
printf("%s was found %d times\n", inRoot->list[i]->word, *((int*)(inRoot->list[i]->val)));
return;
}
比较函数 sortFunc()
接收每个对象的 指针 。数组 inRoot->list
是 bucket *
的数组,因此 sortFunc()
正在接收指向 bucket *
的 指针 :bucket **
.
int
减法也可能溢出。使用惯用的 2 比较来解决这个问题。
int sortFunc(const void *a, const void *b) {
bucket **bucketA = (bucket**) a;
bucket **bucketB = (bucket**) b;
void *vA = (*bucketA)->val;
void *vB = (*bucketB)->val;
int iA = *((int*) vA);
int iB = *((int*) vB);
return (iA > iB) - (iA < iB);
}
我正在尝试根据存储在 "bucket" 结构的 void* 中的值对指向结构(下面的定义)的指针数组进行排序,我知道它是整数。它编译并打印出我的桶数组及其值,没有错误或警告,但它实际上并没有对数组进行排序。我已经使用断言来尝试查找可能导致 qsort 错误的任何地方。
结构定义:
typedef struct _bucket{
void* val;
char *word;
}bucket;
typedef struct _root{
bucket **list;
int hashTableLength;
}root;
要传递给 qsort 函数的排序函数:
int sortFunc(const void *a, const void *b){
bucket *bucketA=(bucket*)a;
bucket *bucketB=(bucket*)b;
int bucketAVal = *((int*)bucketA->val);
int bucketBVal = *((int*)bucketB->val);
assert((bucketAVal&&bucketBVal)!=0);
return bucketAVal-bucketBVal;
}
排序数组并打印:
void sort(root* inRoot, int(*sortFunc)(const void *a, const void *b)){
int length = inRoot->hashTableLength;
assert(length==11); //known length of hash array
for (int i = 0; i<length; i++)
assert(inRoot->list[i] != NULL);
qsort(inRoot->list, length, sizeof(bucket*), sortFunc);
for(int i =0; i<length; i++)
printf("%s was found %d times\n", inRoot->list[i]->word, *((int*)(inRoot->list[i]->val)));
return;
}
比较函数 sortFunc()
接收每个对象的 指针 。数组 inRoot->list
是 bucket *
的数组,因此 sortFunc()
正在接收指向 bucket *
的 指针 :bucket **
.
int
减法也可能溢出。使用惯用的 2 比较来解决这个问题。
int sortFunc(const void *a, const void *b) {
bucket **bucketA = (bucket**) a;
bucket **bucketB = (bucket**) b;
void *vA = (*bucketA)->val;
void *vB = (*bucketB)->val;
int iA = *((int*) vA);
int iB = *((int*) vB);
return (iA > iB) - (iA < iB);
}