我有一个问题是我得到的警告信息。 对于这一行,使用qsort库函数:
qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount);
我收到了这个警告:
警告:传递'qsort'的参数4 从没有a的整数生成指针 投
编辑:
struct_cmp_by_amount是程序中的以下函数。(--->) catalog是一个结构和 MAX定义为100
但是,对于具有相同代码的另一个程序,具有完全相同的struct_cmp_by_amount函数,我没有得到第4个参数的警告!
编辑:我还必须说,在这两个程序中我还没有使用函数原型!但对于第二个程序,它通常与第一个程序相反。qsort(structs, structs_len, sizeof(struct st_ex), struct_cmp_by_amount);
编辑:
st_ex是一个结构
struct st_ex structs[]={./*elements*/..}
size_t structs_len = sizeof(structs) / sizeof(struct st_ex);
int struct_cmp_by_amount(const void *a, const void *b)
{
struct catalogue *ia = (struct catalogue *)a;
struct catalogue *ib = (struct catalogue *)b;
return (int)(100.f*ia->amount - 100.f*ib->amount);
}
我在徘徊为什么会这样。你有什么想法吗?
答案 0 :(得分:5)
我猜,因为我看不到你的代码。
qsort()接受对数组进行排序,条目数,条目大小以及指向比较例程的指针,该例程采用两个指向条目的指针并进行比较。 (我不记得函数的返回类型或约定。)
看起来编译器无法看到比较例程的函数声明或函数原型,因此struct_cmp_by_amount假定它是一个int(根据C规则),并警告你它需要一个指针(到一个函数)在该参数位置。
答案 1 :(得分:1)
struct_cmp_by_amount
的原型必须声明为
int struct_cmp_by_amount (const void* a, const void* b) {
...
}
以避免出现警告,即使您知道 a
且b
有一些T*
。
此外,在调用qsort
之前,请确保前向声明存在。
答案 2 :(得分:1)
问题似乎是,在一种情况下,qsort()
调用可以看到struct_cmp_by_amount()
的声明,而在另一种情况下,它不能。由于你没有使用函数原型,我猜想在一种情况下,函数声明在qsort()
调用之前,在另一种情况下在之后。
此外,列出的第一个qsort()
调用可能会导致问题,因为catalog
是您传递的指针或数组,而sizeof catalog
是您提供的大小。如果catalog
在这里是一个数组,那么你说它是由MAX和整个数组一样大的东西组成的,这意味着你将会遇到比你分配的内存更多的内存,并且可能导致无法结束虫子如果catalog
是一个指针,那么你就是说它指向一个指针大小的项目数组。似乎都不合理。使用sizeof *catalog
或sizeof catalog[0]
会更有意义。
此外,使用浮点数表示美元金额容易出错;你通常最好使用整数类型来表示分数。但这是一个不同的问题。
答案 3 :(得分:0)
在不知道操作数类型的情况下,我们无法解决您的类型错误。
答案 4 :(得分:0)
我假设您的意思是标准C库中的qsort
。您可能忘记包含声明qsort函数的stdlib.h。
编辑:抱歉,没有正确阅读错误消息。实际上,John R. Strohm的另一个答案可能是正确的 - 你没有得到编译器可见的函数的声明。
答案 5 :(得分:0)
这行代码是否正确复制了?:
qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount);
如果是这样,那肯定是:
qsort(catalog, MAX ,sizeof(*catalog), struct_cmp_by_amount);
此外,您的qsort行的示例使用struct_cmp_by_price而不是struct_cmp_by_amount。
正如已经指出的那样,最好检查一下你的声明以及它们是否在范围内。 编译器将struct_cmp_by_amount转换为整数的表示它无法为其找到声明。