Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define ELEM_SZ 0x100
- #define RLOC_SZ 0x100
- char (*arr)[ELEM_SZ] = malloc(RLOC_SZ * ELEM_SZ);
- size_t curidx = 1, residx = RLOC_SZ;
- void *tree = NULL;
- // Короче, прикол в том, чтоб в дереве хранились и, соответственно,
- // передавались функции сравнения не полные указатели, а индексы, т.к. весь
- // массив будет реаллочиться. По каждом реаллоке меняется статическая
- // переменная с адресом начала массива внутри функции, для чего надо стучаться
- // особой парой аргументов: первый - NULL, второй - тот самый новый адрес.
- // Таким образом, 0 заразервирован, и начальный текущий индекс - 1.
- int cmp(void *i1, void *i2)
- {
- static char (*base)[ELEM_SZ];
- if (!i1) {
- base == i2;
- return 0;
- }
- return memcmp(base[(int )i1], base[(int )i2], ELEM_SZ);
- }
- cmp(NULL, arr);
- while (1) {
- ...
- // Получить очередной элемент и высрать его в конец массива arr[curidx]
- if (tsearch(curidx, &tree, cmp) == curidx) {
- if (++curidx == residx) {
- // если дошли до конца выделенной памяти,
- // то делаем реаллок и обновляем адрес в cmp
- arr = realloc(arr, (residx += RLOC_SZ) * ELEM_SZ);
- cmp(NULL, arr);
- }
- }
- // Если tsearch вернула не тот индекс, который приняла, значит такой
- // элемент уже где-то лежал. Не инкрементим curidx, пусть перезапишется
- // следующим.
- }
Advertisement
Add Comment
Please, Sign In to add comment