C 对其他数据类型使用void。

C 对其他数据类型使用void。,c,C,所以我得到了这段代码: int compare(const void *c1, const void *c2) { assert(c1 && c2); char a = *(const char*)c1; char b = *(const char*)c2; if (a > b) return 1; if (a < b) return -1; return 0; } int比较(常数void*c1,常数void*c2) { 断言(c1和c

所以我得到了这段代码:

int compare(const void *c1, const void *c2)
{
    assert(c1 && c2);
  char a = *(const char*)c1;
  char b = *(const char*)c2;
  if (a > b) return 1;
  if (a < b) return -1;
  return 0;
}
int比较(常数void*c1,常数void*c2)
{
断言(c1和c2);
字符a=*(常量字符*)c1;
字符b=*(常量字符*)c2;
如果(a>b)返回1;
如果(a
它的基本功能是获取任意数据类型的两个指针c1和c2,并检查谁比另一个大。我希望这适用于我收到的任何数据类型,但当我发送double或float时,它似乎会产生问题。

我应该添加/更改什么?

这不能在C中完成。C没有运行时类型信息(RTTI)

您要做的是将
c1
指向的字节数与
c2
指向的字节数进行比较。我们甚至不知道有多少字节,更不用说它们应该代表什么类型了。因此,没有办法编写一个“通用”函数来神奇地决定应用无限多个比较算法中的哪一个


附录:如果有可能做到这一点,
qsort
将被设计成这样一个内置函数,您不必编写自己的比较函数。
qsort
的设计者们强调了这一责任,并将编写比较函数的问题退回给用户,这一事实几乎证明了这是不可能的


不幸的是,无论何时调用
qsort
,几乎每次都必须编写自己的自定义比较函数;你不能只写一次通用的,完成它。

检查谁比其他人大,但这不完全是它所做的。可能重复-和许多其他肮脏黑客的请求类似。@SouravGhosh:更糟的是:它是实现定义的。这应该是
qsort
或类似函数的回调吗?根本不可能写一个“通用”的;
qsort
设计的基础是,虽然它不知道要排序的数据类型或如何对值排序,但您必须这样做,这意味着您必须始终编写特定的比较函数。如果
c1
c2
指向结构会怎么样?怎么可能有一个单一的、通用的算法来比较它们呢?我怎样才能使用这样的函数,使它适合我接收到的任何类型的数据类型呢?@LamaEu。您不能这样做,因为您无法提前知道排序要求的数据类型,或者即使是升序还是降序。如上所述,假设您有一个结构数组,并且希望在第二个字段上排序。或者更糟糕的是,如果第二个字段相等,则在第三个字段上排序。注意:使用cleaver的
\u Generic()
qsort\u s()
,可以编写处理许多基本类型的代码。然而,正如你所回答的,没有完全通用的解决方案。