【问题标题】:Same code... but warning!Any ideas?相同的代码......但警告!有什么想法吗?
【发布时间】:2011-02-20 10:16:20
【问题描述】:

我对收到的警告信息有疑问。 对于这一行,使用 qsort 库函数:

qsort(catalog, MAX ,sizeof catalog, struct_cmp_by_amount); 

我收到此警告:

警告:传递“qsort”的参数 4 从不带 a 的整数生成指针 演员表

编辑:

struct_cmp_by_amount 是程序上的以下函数。(--->) 目录是一个结构和 MAX 定义为 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);  
}

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

【问题讨论】:

  • 请提供声明变量struct_cmp_by_amountstruct_cmp_by_price的代码,以及qsort的签名(如果您使用自己的)
  • 这是信息不足的地方,而且您发布的小代码与您的文本相矛盾(struct_cmp_by_amount 与 struct_cmp_by_price 的功能不完全相同)。至少显示所有使用的标识符的声明。
  • 好吧,你是对的!我有点生气,我没有发布它。现在完成了!
  • 发布信息不足的问题对任何人都没有好处,包括您。等待三个小时并添加一些(不是全部)必要信息是一种改进,但出于对试图帮助您的人的礼貌,我建议在原始问题中包括必要的信息,并按要求提供更多信息合理及时。
  • @David Thornley:也许你是对的,你正在等待 3 个小时来解决我当时试图解决的代码问题。网络连接线的问题永远无法避免。无论如何,谢谢。

标签: c callback arguments warnings


【解决方案1】:

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

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

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

【讨论】:

  • 这听起来很对。如果函数指针在范围内但签名关闭,编译器将抱怨“不兼容”。如果它甚至不在范围内,它将被隐式视为int,正如@John R. Strohm 所说。
  • 你说的是对的,但为什么它在第二个例子中起作用?两次我都没有使用原型!
  • @FILIaS:可能编译器认为它已经警告过你一次,但它认为没有必要警告你两次。
  • R.Strohm。这可能吗?但是怎么做?在第一个程序中,我两次使用此命令,两次都收到警告。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    struct_cmp_by_amount的原型必须声明为

    int struct_cmp_by_amount (const void* a, const void* b) {
      ...
    }
    

    为了避免警告,即使您知道 ab 是一些 T*

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

    【讨论】:

    • 当我使用const int * 传递一个指向函数的指针时,我得到warning: passing argument 4 of ‘qsort’ from incompatible pointer type ..... expected ‘__compar_fn_t’ but argument is of type ‘int (*)(const int *, const int *)’。我认为他只是不在范围内。
    • 正如您在编辑后的帖子中看到的那样,函数是以这种方式声明的。好的,我明白你对函数调用的意思,但第二个都不存在,但一个正常工作!
    【解决方案4】:

    在不知道操作数类型的情况下,我们无法解决您的类型错误。

    【讨论】:

      【解决方案5】:

      我假设您的意思是标准 C 库中的 qsort。您可能忘记包含声明 qsort 函数的 stdlib.h。

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

      【讨论】:

      • 图书馆包括在内!两个程序上的声明都不存在..但是从这个角度来看,为什么它在第二个工作?我没有收到任何警告!
      【解决方案6】:

      这行代码复制正确吗?:

      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 强制转换为整数的事实表明它找不到它的声明。

      【讨论】:

      • sizeof 在应用于实际类型时需要括号,但在应用于具有类型(并且包括单个变量)的表达式时则不需要。当然,给出一个数组,并说一个元素类型与数组大小相同(也许这应该是sizeof *catalog),这样做是错误的。
      • @David - 我没有注意 sizeof(*catalog) 是我真正的意思。编译器抱怨括号将它们放入是否需要,我已经遇到了很多麻烦。
      • 但是警告是针对第四个参数的! ://
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2011-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多