在 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 比较函数上出现错误的主要内容,如果未能解决你的问题,请参考以下文章