идентифицировать указатель элемента / класса после qsort - PullRequest
4 голосов
/ 08 июля 2011

первый вопрос, поэтому, пожалуйста, прости мою наивность здесь.

Я углубляюсь в библиотеку триангуляции для c ++, которая сортирует массив указателей структуры перед запуском метода триангуляции.Я пытаюсь отслеживать один конкретный указатель структуры (XYZ) во всем приложении, который обновляется в соответствии с положением мыши.Проблема в том, что всякий раз, когда применяется метод 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

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

У вас есть несколько вариантов:

  • Вы можете искать вашу уникальную запись после сортировки. Если вы добавляете маркерный член, ищите линейно для маркера. Если какая-либо запись с совпадающей координатой X / Y так же хороша, как и любая другая, вы можете bsearch указать ее в отсортированном массиве. Вы можете объединить их, используя bsearch, чтобы найти правильную X координату с последующим (более коротким) линейным поиском маркера.
  • Вы можете добавить слой косвенности. Вместо сортировки массива XYZ структур создайте параллельный список индексов или указателей в этом массиве и вместо этого отсортируйте ссылки XYZ * или int. Ваша ссылка mousePointer останется действительной.
0 голосов
/ 08 июля 2011

Разве третий аргумент в qsort () не должен быть размером (XYZ *)?Вы сортируете указатели, а не объекты, на которые указывают.

...