在qsort之后标识项目/类指针

时间:2011-07-07 23:15:46

标签: c++ pointers struct qsort

第一个问题请原谅我的天真。

我正在深入研究c ++的三角测量库,它在运行它的三角测量方法之前对一组struct指针进行排序。我试图在我的应用程序中跟踪一个特定的结构指针(XYZ),它根据鼠标位置进行更新。问题是,无论何时应用qsort方法,该指针都会改变。如何识别或跟踪此结构XYZ指针?

这是结构&排序...

struct XYZ{
  double x, y, z;
};

int XYZCompare(const void *v1, const void *v2){
  XYZ *p1, *p2;

  p1 = (XYZ*)v1;
  p2 = (XYZ*)v2;
  if(p1->x < p2->x)
    return(-1);
  else if(p1->x > p2->x)
         return(1);
       else
         return(0);
}

XYZ结构数组(此处为2用于测试),带有鼠标指针引用...

XYZ *allPointers = new XYZ[100];
allPointers[0].x = 100;
allPointers[0].y = 200;
allPointers[0].z = 0;
allPointers[1].x = 50;
allPointers[1].y = 80;
allPointers[1].z = 0;
XYZ *mousePointer = &allPointers[0];

排序和更新鼠标方法。

mousePointer->x = mouseX;
mousePointer->y = mouseY;

// If I don't qsort here the reference is fine, but I need to.
qsort(allPointers, 2, sizeof(XYZ), XYZCompare); 
// triangulate, etc

2 个答案:

答案 0 :(得分:3)

您有几个选择:

  • 您可以在排序后搜索您的唯一条目。如果您为标记添加线性标记成员搜索。如果具有匹配的X / Y坐标的任何条目与排序数组中的任何其他条目({1}}一样好。您可以使用bsearch来找到正确的bsearch坐标,然后是(更短的)线性搜索标记。
  • 您可以添加一个间接层。不是对X结构数组进行排序,而是创建一个并行的索引列表或指向该数组的指针,并对XYZXYZ *引用进行排序。您的int引用仍然有效。

答案 1 :(得分:-1)

qsort()的第三个arg不应该是size(XYZ *)吗?你要对指针进行排序,而不是指向的对象。