C 相同的代码。。。但是警告!有什么想法吗?

C 相同的代码。。。但是警告!有什么想法吗?,c,callback,arguments,warnings,C,Callback,Arguments,Warnings,我有一个问题要问我得到的警告信息。 对于此行,使用qsort库函数: qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount); 我得到这个警告: 警告:正在传递'qsort'的参数4 从整数生成指针,而不使用 铸造 编辑: struct\u cmp\u by\u amount是程序上的以下函数。(-->) 目录是一个结构和 最大值定义为100 但是,对于另一个具有相同代码的程序,具有完全相同的struct_cmp_by_amount

我有一个问题要问我得到的警告信息。 对于此行,使用qsort库函数:

qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount); 
我得到这个警告:

警告:正在传递'qsort'的参数4 从整数生成指针,而不使用 铸造

编辑:

struct\u cmp\u by\u amount是程序上的以下函数。(-->) 目录是一个结构和 最大值定义为100

但是,对于另一个具有相同代码的程序,具有完全相同的struct_cmp_by_amount函数,我没有得到第四个参数的警告

编辑:我还不得不说,在这两个程序中,我都没有使用函数原型!但对于第二个程序,它与第一个程序相比工作正常

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

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

如果不知道操作数的类型,那么我们就无法解决你的类型错误。

我猜,因为我看不到你的代码

qsort()获取要排序的数组、条目的数量、条目的大小,以及指向比较例程的指针,该例程使用两个指向条目的指针进行比较。(我不记得函数的返回类型或约定。)


编译器似乎看不到比较例程struct_cmp_by_amount的函数声明或函数原型,因此假定它是int(根据C规则),并警告您它需要一个指针(指向函数)在该参数位置。

我假定您指的是标准C库中的
qsort
。很可能您忘记了包含stdlib.h,它声明了qsort函数


编辑:抱歉,没有正确读取错误消息。事实上,John R.Strohm的另一个答案可能是正确的-您还没有对编译器可见的函数进行声明。

必须将
struct\u cmp\u by\u amount
的原型声明为

int struct_cmp_by_amount (const void* a, const void* b) {
  ...
}
为了避免警告,即使您知道
a
b
是一些
T*


另外,在调用
qsort

之前,请确保转发声明存在。这行代码复制是否正确

qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount);
如果是这样的话,它肯定应该是:

qsort(catalog, MAX ,sizeof(*catalog), struct_cmp_by_amount);
此外,您的工作qsort行示例使用的是按价格计算的结构cmp,而不是按金额计算的结构cmp

正如已经指出的那样,最好检查您的声明以及它们是否在范围内。
编译器将struct_cmp_by_amount强制转换为整数的facft表明它找不到它的声明。

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

此外,列出的第一个
qsort()
调用可能会导致问题,因为
catalog
是您要传递的指针或数组,而
sizeof catalog
是您要给它的大小。如果这里的
catalog
是一个数组,那么您的意思是它由与整个数组一样大的最大值组成,这意味着您将占用比分配的内存多得多的内存,并可能导致无尽的错误。如果
catalog
是指针,则表示它指向指针大小的项目数组。两者似乎都不可信。使用
sizeof*catalog
sizeof catalog[0]
更有意义


此外,使用浮点数表示美元金额容易出错;通常最好使用整数类型来表示美分数。不过,这是另一个问题

请提供声明变量
struct\u cmp\u by\u amount
struct\u cmp\u by\u price
的代码,以及
qsort
的签名,如果您使用自己的,这是信息不足的方式,并且您发布的代码与您的文本相矛盾(按金额计算的结构cmp与按价格计算的结构cmp不是完全相同的函数)。显示,至少,所有使用的标识符的声明。好吧,你是对的!我有点生气,没有发布。现在完成了!发布信息不足的问题对任何人都没有任何好处,包括你。等待三个小时并添加一些(而不是全部)必要的信息是一种改进“是的,但是出于对那些试图帮助你的人的礼貌,我建议在原始问题中包括必要的信息,并按照合理的要求及时提供更多信息”。@David Thornley:也许你是对的,你在等我的代码问题3个小时,而我当时正试图解决这个问题。网络连接线路的问题从未出现过r是可以阻止的。Thanx。这听起来是对的。如果函数指针在作用域中,但签名是关闭的,编译器会抱怨这是“不兼容的”。如果它甚至不在范围内,它将被隐式地视为
int
,正如@John R.Strohm所说。你说的是对的,但为什么它在第二个示例中起作用?两次我都没有使用原型!@FILIaS:可能编译器认为它已经警告过你一次,并且认为没有必要警告你两次。R.Strohm。这可能吗?但是ow?在第一个程序中,我使用了两次此命令,两次都得到警告。当我使用
const int*
传递指向函数的指针时,我得到
警告:传递来自不兼容指针类型的'qsort'参数4…..应为'\u compar\u fn\t',但参数类型为'int(*)(const int*,const int*)“
。我想他只是没有把它放在范围内。正如你在编辑的帖子上看到的那样,函数是以这种方式声明的。好的,我理解你关于调用函数的意思,但第二个函数不存在,但它正常工作!
sizeof
在应用时需要括号