qsort C++:调用'qsort'没有匹配函数

qsort c++:no matching function for call to 'qsort'

本文关键字:qsort 函数 C++ 调用      更新时间:2023-10-16

这个是compareX和compareY

struct Point
{
long long int x, y;
};

long long int compareX(const void* a, const void* b)
{
Point *p1 = (Point *)a,  *p2 = (Point *)b;
return (* (long long int * )(p1->x - p2->x));
}
long long int compareY(const void* a, const void* b)
{
Point *p1 = (Point *)a,   *p2 = (Point *)b;
return (* (long long int * )(p1->y - p2->y));
}

这是调用比较 Y 的 qsort

long long int stripClosest(Point strip[], long long int size, long long int 
d)
{
long long int min = d; 
qsort(strip, size, sizeof(Point), compareY); 

for (long long int i = 0; i < size; ++i)
    for (long long int j = i+1; j < size && (strip[j].y - strip[i].y) < min; 
++j)
        if (dist(strip[i],strip[j]) < min)
            min = dist(strip[i], strip[j]);
return min;
}

这是调用 compareX 的 qsort

long long int closest(Point P[], long long int n)
{
qsort(P, n, sizeof(Point), compareX);
return closestUtil(P, n);
}

我不知道为什么说"注意:候选函数不可行:没有已知的从'长长(常量无效*,常量无效)'到'int(_Nonnull)(常量无效*,常量无效*)'的第4个参数"和"错误:调用'qsort'没有匹配函数"

函数 qsort 要求相应参数的函数类型为

int ( const void *, const void * )

还有这种带有指针的魔法

* (long long int * )(p1->x - p2->x)

不清楚并导致未定义的行为。

因此,例如,函数compareX可以通过以下方式定义

int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);
    return (p2->x < p1->x) - (p1->x < p2->x);
}

或者可以用"C"链接声明

extern "C" int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);
    return (p2->x < p1->x) - (p1->x < p2->x);
}

考虑到C++您可以使用带有比较函数的标准算法std::sort

这是一个演示程序,展示了使用标准 C 函数qsort和标准 C++ 算法std::sort的两种方法。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstdlib>
struct Point
{
    long long int x;
    long long int y;
};
int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);
    return (p2->x < p1->x) - (p1->x < p2->x);
}
int main()
{
    {
        Point p[] = { { 2, 1 }, { 1, 1 }, { 3, 1 } };
        qsort(p, sizeof(p) / sizeof(*p), sizeof(Point), compareX);
        for (const auto &item : p)
        {
            std::cout << "(" << item.x << ", " << item.y << ") ";
        }
        std::cout << std::endl;
    }
    {
        Point p[] = { { 2, 1 },{ 1, 1 },{ 3, 1 } };
        std::sort( std::begin( p ), std::end( p ),
            [](const Point &a, const Point &b)
            {
                return a.x < b.x;
        });
        for (const auto &item : p)
        {
            std::cout << "(" << item.x << ", " << item.y << ") ";
        }
        std::cout << std::endl;
    }
    return 0;
}

程序输出为

(1, 1) (2, 1) (3, 1)
(1, 1) (2, 1) (3, 1)