【问题标题】:Getting an error on a qsort compare function在 qsort 比较函数上出现错误
【发布时间】: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 *)'?有没有办法修复我的比较功能?

【问题讨论】:

    标签: c++builder strcmp qsort


    【解决方案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);
        ...
    }
    

    【讨论】:

    • 优秀,雷米,一如既往。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2014-10-10
    • 2018-03-26
    • 2020-03-17
    • 2020-12-15
    • 2015-05-22
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多