簡體   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