繁体   English   中英

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

[英]identify item/class pointer after qsort

第一个问题,请原谅我在这里的幼稚。

我正在研究 c++ 的三角测量库,它在运行它的三角测量方法之前对结构指针数组进行排序。 我试图在整个应用程序中跟踪一个特定的结构指针 (XYZ),它会根据鼠标 position 进行更新。 问题是,每当应用 qsort 方法时,这个指针就会改变。 如何识别或跟踪这个 struct 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

你有几个选择:

  • 您可以在排序后搜索您的唯一条目。 如果添加标记成员,则线性搜索标记。 如果任何具有匹配 X/Y 坐标的条目与任何其他条目一样好,您可以在排序bsearch中搜索它。 您可以通过使用bsearch找到正确的X坐标,然后对标记进行(较短的)线性搜索来组合它们。
  • 您可以添加一个间接层。 不要对XYZ结构数组进行排序,而是在该数组中创建索引或指针的并行列表,然后对XYZ *int引用进行排序。 您的mousePointer引用将保持有效。

qsort() 的第三个参数不应该是 size(XYZ*) 吗? 您正在对指针进行排序,而不是对指向的对象进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM