如何解决在 qsort 比较函数上出错
我使用的是 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 *)'?有没有办法修复我的比较功能?
解决方法
__closure
是 Borland 编译器扩展,用于获取指向非 static
类方法的指针,而不考虑所使用的类的类型。这在 VCL/FMX 组件中最常用,它允许您从您想要的任何类分配事件处理程序,而标准 C++ 通常不允许您这样做。
qsort()
在第 4 个参数中需要一个 C 风格的函数指针。你不能得到这样一个指向非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,sort_function);
...
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。