Guest User

Untitled

a guest
May 26th, 2019
187
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.90 KB | None | 0 0
  1. #define ELEM_SZ 0x100
  2. #define RLOC_SZ 0x100
  3.  
  4. char (*arr)[ELEM_SZ] = malloc(RLOC_SZ * ELEM_SZ);
  5. size_t curidx = 1, residx = RLOC_SZ;
  6.  
  7. void *tree = NULL;
  8.  
  9. // Короче, прикол в том, чтоб в дереве хранились и, соответственно,
  10. // передавались функции сравнения не полные указатели, а индексы, т.к. весь
  11. // массив будет реаллочиться. По каждом реаллоке меняется статическая
  12. // переменная с адресом начала массива внутри функции, для чего надо стучаться
  13. // особой парой аргументов: первый - NULL, второй - тот самый новый адрес.
  14. // Таким образом, 0 заразервирован, и начальный текущий индекс - 1.
  15.  
  16. int cmp(void *i1, void *i2)
  17. {
  18.     static char (*base)[ELEM_SZ];
  19.     if (!i1) {
  20.         base == i2;
  21.         return 0;
  22.     }
  23.     return memcmp(base[(int )i1], base[(int )i2], ELEM_SZ);
  24. }
  25. cmp(NULL, arr);
  26.  
  27. while (1) {
  28.     ...
  29.     // Получить очередной элемент и высрать его в конец массива arr[curidx]
  30.     if (tsearch(curidx, &tree, cmp) == curidx) {
  31.         if (++curidx == residx) {
  32.             // если дошли до конца выделенной памяти,
  33.             // то делаем реаллок и обновляем адрес в cmp
  34.             arr = realloc(arr, (residx += RLOC_SZ) * ELEM_SZ);
  35.             cmp(NULL, arr);
  36.         }
  37.     }
  38.     // Если tsearch вернула не тот индекс, который приняла, значит такой
  39.     // элемент уже где-то лежал. Не инкрементим curidx, пусть перезапишется
  40.     // следующим.
  41. }
Advertisement
Add Comment
Please, Sign In to add comment