在 qsort 比较函数上出现错误

Posted

技术标签:

【中文标题】在 qsort 比较函数上出现错误【英文标题】:Getting an error on a qsort compare function 【发布时间】:2021-10-01 13:04:33 【问题描述】:

我正在使用 C++Builder 10.4.2 并且遇到了 qsort 问题。我很少使用 qsort 所以我可能会犯一个笨拙的错误。数组 'buffer' 是一个 2D 'char' 数组,包含超过 26,000 行的单个单词。

这是电话:

qsort((void *)buffer,wordcount,sizeof(buffer[1]),sort_function);

这是比较函数:

int TForm::sort_function(const void *a, const void *b)

  return( strcmp((char *)a,(char *)b) );

这是错误信息。请注意,它在第四个参数中抱怨 sort_function

search.h(46): 候选函数不可行:没有已知的从 'int (__closure *)(const void *, const void *)' 到 'int (*)(const void *, const void *) 的转换__attribute__((cdecl))'

什么是'int(__closure *)'?有没有办法修复我的比较功能?

【问题讨论】:

【参考方案1】:

__closure 是 Borland 编译器扩展,用于获取指向非static 类方法的指针,而与所使用的类的类型无关。这在 VCL/FMX 组件中最常用,它允许您从任何您想要的类中分配事件处理程序,而标准 C++ 通常不允许您这样做。

qsort() 在第四个参数中需要一个 C 风格的函数指针。你不能得到这样一个指向 non-static 类方法的指针。

要解决这个问题,您需要使用:

独立函数 static 类方法 一个 非捕获 C++ lambda(仅限 C++11 或更高版本)

由于您的sort_function() 不需要访问您的TForm 对象,因此将sort_function() 声明为static 将是最简单的解决方法:

// .h

class TForm

...
private:
    static int sort_function(const void *a, const void *b);
    void doSomething();
...
;
// .cpp

int TForm::sort_function(const void *a, const void *b)

    return strcmp((const char *)a, (const char *)b);


void TForm::doSomething()

    ...
    qsort(buffer, wordcount, sizeof(buffer[1]), sort_function);
    ...

但是,它确实应该是一个独立的函数,因为它实际上与您的 TForm 类根本没有关系:

// .cpp

static int sort_function(const void *a, const void *b)

    return strcmp((const char *)a, (const char *)b);


void TForm::doSomething()

    ...
    qsort(buffer, wordcount, sizeof(buffer[1]), sort_function);
    ...

【讨论】:

优秀,雷米,一如既往。谢谢。

以上是关于在 qsort 比较函数上出现错误的主要内容,如果未能解决你的问题,请参考以下文章

Qsort比较函数

qsort函数实现对任意数据的排序

如何从 stdlib 为 qsort 编写比较函数?

有没有一种方法可以在不使用大量分支语句的情况下为无符号整数编写 qsort 比较函数?

qsort()函数(C)

C语言qsort()库函数用回调函数的原因