在 qsort 比较函数上出错
Getting an error on a qsort compare function
我使用的是 C++Builder 10.4.2,但遇到了 qsort 问题。我很少使用 qsort 所以我可能会犯一个笨拙的错误。数组 'buffer' 是一个二维 '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) );
}
这是错误信息。请注意,它在抱怨第 4 个参数的 sort_function
:
search.h(46): candidate function not viable: no known conversion from 'int (__closure *)(const void *, const void *)' to 'int (*)(const void *, const void *) __attribute__((cdecl))'
什么是'int (__closure *)'?有没有办法修复我的比较功能?
__closure
是 Borland 编译器扩展,用于获取指向非 static
class 方法的指针,而不考虑所使用的 class 类型。这在 VCL/FMX 组件中最常用,它允许你从任何你想要的 class 分配事件处理程序,这不是标准 C++ 通常允许你做的事情。
qsort()
在第 4 个参数中需要一个 C 风格的函数指针。你不能得到这样一个指向 non-static
class 方法的指针。
要解决这个问题,您需要使用:
- 独立函数
- 一种
static
class方法
- a 非捕获 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
class 完全没有关系:
// .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);
...
}
我使用的是 C++Builder 10.4.2,但遇到了 qsort 问题。我很少使用 qsort 所以我可能会犯一个笨拙的错误。数组 'buffer' 是一个二维 '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) );
}
这是错误信息。请注意,它在抱怨第 4 个参数的 sort_function
:
search.h(46): candidate function not viable: no known conversion from 'int (__closure *)(const void *, const void *)' to 'int (*)(const void *, const void *) __attribute__((cdecl))'
什么是'int (__closure *)'?有没有办法修复我的比较功能?
__closure
是 Borland 编译器扩展,用于获取指向非 static
class 方法的指针,而不考虑所使用的 class 类型。这在 VCL/FMX 组件中最常用,它允许你从任何你想要的 class 分配事件处理程序,这不是标准 C++ 通常允许你做的事情。
qsort()
在第 4 个参数中需要一个 C 风格的函数指针。你不能得到这样一个指向 non-static
class 方法的指针。
要解决这个问题,您需要使用:
- 独立函数
- 一种
static
class方法 - a 非捕获 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
class 完全没有关系:
// .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);
...
}