qsort 比较函子的分段错误

Segmentation fault at qsort's compare functor

本文关键字:分段 错误 比较 qsort      更新时间:2023-10-16

我有以下结构,由指向下一个点的指针(nextPoint(、点的高度(realHeight

typedef struct _cloudPoint {
double realHeight;
cv::Point3f point;
_cloudPoint* nextPoint;
} cloudPoint;

然后,我需要对cloudPoint的向量进行排序,我通过指针将其传递给一个函数。所以我有这个函数的输入参数:

std::vector<cloudPoint>* cPointsVector

在我的函数中,我希望使用qsort对cPointsVector向量进行排序,并使用这个比较函数:

int cmp_unique(const void* _pa_, const void* _pb_) {
Segmentation::cloudPoint* pa = (Segmentation::cloudPoint*)_pa_;
Segmentation::cloudPoint* pb = (Segmentation::cloudPoint*)_pb_;
if (pa->point.x > pb->point.x) {
return -1;
}
else {
if (pa->point.y > pb->point.y) {
return -1;
}
else {
if (pa->point.z > pb->point.z) {
return -1;
}
}
}
return 1;
}

因此,要调用qsort,我使用:

qsort(cPointsVector, cPointsVector->size(), sizeof(cloudPoint), cmp_unique);

但在排序过程的中间,它给了我一个关于函子的第一个if的Segmentation错误:

if (pa->point.x > pb->point.x) {

通过分析我的代码,或者我在比较函数中执行了一些不正确的内存访问,或者cPointsVector填充得很糟糕,但hyposis都不起作用,因为我总是使用非Null cloudPoint的,带有非NullOpenCV坐标点。

提前感谢

试着这样称呼它:

qsort(&(*cPointsVector)[0], cPointsVector->size(), sizeof(cloudPoint), cmp_unique);

qsort(cPointsVector->data(), cPointsVector->size(), sizeof(cloudPoint), cmp_unique);

cPointsVector传递给qsort时,将传递指向向量对象的指针,而不是指向向量的第一个元素的指针。请记住,C++中的向量不是C数组。它是一个对象,封装了一个C数组,该数组的地址与向量的地址不同。

即使您想要使用qsort,这也是您最终应该使用std::sort:完成排序的方式

std::sort(cPointsVector->begin(), cPointsVector->end(), 
[](Segmentation::cloudPoint* s1, Segmentation::cloudPoint *s2) 
{ 
return std::tie(s1->point.x, s1->point.y, s1->point.z) > 
std::tie(s2->point.x, s2->point.y, s2->point.z); 
});

请注意,由于std::sort是类型安全的,因此没有完成C样式转换。

lambda函数基本上完成了qsort比较试图做的事情,即按(x,y,z)降序排序。

std::tie是执行级联if语句的一种简单方法,将x的与x的、y的与y的进行比较,等等。