【发布时间】:2020-03-17 18:20:01
【问题描述】:
我有以下结构,由指向下一个点 (nextPoint) 的指针、点的高度 (realHeight) 和 3D 坐标 (point ) 来自 OpenCV 库,它有 3 个参数 (x,y,z):
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 的分段错误:
if (pa->point.x > pb->point.x) {
仅通过分析我的代码,或者我在比较函子中执行了一些不正确的内存访问,或者 cPointsVector 被严重填充,但假设都没有意义,因为我总是使用非 Null cloudPoint's,非空 OpenCV 坐标点。
提前致谢
【问题讨论】:
-
你为什么不用
std::sort? -
@PaulMcKenzie 因为我正在将我的一些代码从 c 升级到 c++,并希望在从 c 升级到 c++ 函数之前确保一切都按预期执行。你认为这可能是我问题的根源吗?我会切换并更新你的结果。
-
几乎没有充分的理由使用指向
vector的指针。您可能对自己过于苛刻。建议:不要尝试像用 C 编程那样用 C++ 编程。这看起来很诱人,但它会给你带来更多的问题。 -
@Diogo -- 一看到
qsort,就应该立即切换到std::sort。std::sort(cPointsVector.begin(), cPointsVector.end(), your_predicate);。无需强制转换,直观,运行速度可能比qsort快。 -
我使用指向向量的指针... -- C++ 有一个叫做
reference的东西,它在 C 中不存在。
标签: c++ vector struct segmentation-fault qsort