qsort 比较函子的分段错误
Segmentation fault at qsort's compare functor
我有以下结构,由指向下一个点的指针(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
的进行比较,等等。
相关文章:
- 在某些循环内使用vector.push_back时出现分段错误
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 当我的阵列太大时出现分段错误
- 分段错误当我试图运行程序时出错
- 在c++中初始化矩阵时出现分段错误(核心转储)
- 尝试使用集合函数时出现分段错误
- 我无法缩小此分段错误的原因
- g++的分段错误(在NaN上使用to_string两次时)
- 我是如何在这段代码中出现分段错误的
- 创建结构的数组时遇到分段错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 在 c++ 中实现 Trie 时出现分段错误
- 为什么 fstream 在打开带有格式的文件时会导致分段错误?
- 为什么我遇到分段错误?
- 动态类的分段错误(家庭作业问题)
- 分段错误 - 读取初始化指针的数组
- 如何摆脱C ++中的分段错误错误?
- 使用 CTYPE 时出现分段错误
- 为什么代码给出分段错误?