2011-07-07 69 views
4

第一個問題,請原諒我的天真。qsort後識別物品/班級指針

我正在潛入C++的三角測量庫,它在運行三角測量方法之前對結構指針數組進行排序。我試圖跟蹤一個特定的結構指針(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 
+0

如果你真的使用C++而不是'c',通常使用''而不是'qsort'中的'std :: sort'更好(即更快)。由於'std :: sort'是一個模板函數,它知道被排序的數組的數據類型,因此可以更高效地完成任務。 –

回答

-1

不應該第三個參數爲qsort()是大小(XYZ *)?您正在對指針進行排序,而不是指向的對象。

+0

該死的,這幾乎工作,但它搞亂三角測量的順序。我試圖不去改變大部分原始的三角測量方法。不管怎麼說,還是要謝謝你。 – user834466

3

你有兩個選擇:

  • 您可以搜索排序後的唯一項目。如果您爲標記線性添加標記成員搜索。如果任何具有匹配X/Y座標的條目與其他任何條目一樣好,您可以在排序後的數組中使用bsearch。您可以通過使用bsearch來找到合適的X座標,然後對標記進行(較短)線性搜索。
  • 您可以添加一個間接層。而不是排序您的XYZ結構數組,而是將索引或指針並行列表創建到該數組中,然後對XYZ *int引用進行排序。您的mousePointer參考將保持有效。
+0

+1爲間接解決方案層:) – user258808

+0

獨特的條目進行排序!完善。 – user834466