相同的代码...但警告!任何想法?

时间:2010-05-17 13:45:53

标签: c callback arguments warnings

我有一个问题是我得到的警告信息。 对于这一行,使用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);  
}

我在徘徊为什么会这样。你有什么想法吗?

6 个答案:

答案 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) {
  ...
}

以避免出现警告,即使您知道 ab有一些T*

此外,在调用qsort之前,请确保前向声明存在。

答案 2 :(得分:1)

问题似乎是,在一种情况下,qsort()调用可以看到struct_cmp_by_amount()的声明,而在另一种情况下,它不能。由于你没有使用函数原型,我猜想在一种情况下,函数声明在qsort()调用之前,在另一种情况下在之后。

此外,列出的第一个qsort()调用可能会导致问题,因为catalog是您传递的指针或数组,而sizeof catalog是您提供的大小。如果catalog在这里是一个数组,那么你说它是由MAX和整个数组一样大的东西组成的,这意味着你将会遇到比你分配的内存更多的内存,并且可能导致无法结束虫子如果catalog是一个指针,那么你就是说它指向一个指针大小的项目数组。似乎都不合理。使用sizeof *catalogsizeof 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转换为整数的表示它无法为其找到声明。