From hostip на mail.ru Mon Jan 24 01:36:55 2011 From: hostip на mail.ru (=?koi8-r?Q?=E4=C5=CE=C9=D3_=ED=D9=D3=CF=D7?=) Date: Mon, 24 Jan 2011 00:36:55 +0300 Subject: [cdev] hash table In-Reply-To: <4D1882D3.4030100@komitex.ru> References: <4D1882D3.4030100@komitex.ru> Message-ID: Григорий Александрович, проверьте пожалуйста. Все функции проверили, все работает. Авторы: Мысов Денис, Калаев Алексей, Сергей Кожеванов. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 11167 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 1685 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Mon Jan 24 13:29:58 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 24 Jan 2011 12:29:58 +0300 Subject: [cdev] hash table In-Reply-To: References: <4D1882D3.4030100@komitex.ru> Message-ID: <4D3D4696.1060201@komitex.ru> Я чуть позже этим обязательно займусь, глазами пробежался, есть мелкие замечания. В целом, я вам поставлю зачёт если тесты пройдут успешно. -- Г.А. Денис Мысов пишет: > Григорий Александрович, проверьте пожалуйста. > Все функции проверили, все работает. > Авторы: Мысов Денис, Калаев Алексей, Сергей Кожеванов. > > > ------------------------------------------------------------------------ > > _______________________________________________ > cdev mailing list > cdev на wiki.syktsu.ru > http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev From rg-400 на list.ru Mon Jan 24 19:44:57 2011 From: rg-400 на list.ru (rg-400) Date: Mon, 24 Jan 2011 18:44:57 +0300 Subject: [cdev] hash table In-Reply-To: References: <4D1882D3.4030100@komitex.ru> Message-ID: <4D3D9E79.5040904@list.ru> Ошибка в функции hash_table_destroy. У тебя поле tabel указывает на структуру, которая тоже указаывает на структуру и т.д. (т.е. связный список). free((*table)->table); - удалить лишь первый элемент списка и адес в поле (*table)->table->next потеряется и ее будет невозможно освободить. From sitkarev на komitex.ru Mon Jan 24 20:47:08 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 24 Jan 2011 19:47:08 +0300 Subject: [cdev] hash table In-Reply-To: References: <4D1882D3.4030100@komitex.ru> Message-ID: <4D3DAD0C.4090700@komitex.ru> Теперь замечания. 1. Несколько небрежное оформление. Стиль не выдержан. Между бинарными операторами где-то есть пробелы, где-то их нет. Например, в default_compare(): if (a>b) return 1; ... в hash_rebuild() уже так: if (hash->size < prime[i]) { ... 2. Вам не совсем понятно где в Си используется (;) а где нет. Он обозначает конец конструкции, у которой нет явных разделителей. Например, в управляющей конструкции if-else, циклах for, while они есть, это фигурные скобки ({) и (}). Тело функции тоже помещается в блок, он начинается и заканчивается тоже фигурными скобками. Поэтому там не нужен (;). Здесь не нужно ставить (;) везде. while(b->key != key) { if (b->next == NULL){ return -1; }else{ b = b->next; }; }; Должно быть так: while (b->key != key) { if (b->next == NULL) { return -1; } else { b = b->next; } } 3. Параметры для public функций нужно проверять (если это возможно) ДО того как вы их начнёте использовать. int hash_table_insert(struct hash_table *table, void *key, void *data) { unsigned int idx; if (table->count < (table->collisions * 2)) { hash_rebuild(table); } if (table == NULL) { return -1; } ... То что table у вас NULL -- вы проверяете после того как уже разыменовывали поля этой структуры по этому адресу. Это некорректно. Наверное стоило проверять коллизии иначе, было бы яснее. float coef; ... coef = (float)table->count / (float)table->collisions; if (coef <= 2.0) hash_rebuild(table); 4. При удалении таблицы память выделенная для коллизионных ведёр "утечёт". Смотрите что писал Егор (rg-400@) внимательнее, там всё есть. 5. Боюсь что вы не проверяли функции, потому что в тестах у вас они все не вызываются. Вы должны написать (подумать) тесты, чтобы проверить как они у вас работают -- то что вы написали. 6. hash_table_iterate_deinit() -- не нашёл реализацию. Забыли сделать? Если замечу ещё что-то, напишу. Доделать осталось чуть-чуть. -- Г.А. Денис Мысов пишет: > Григорий Александрович, проверьте пожалуйста. > Все функции проверили, все работает. > Авторы: Мысов Денис, Калаев Алексей, Сергей Кожеванов. From rg-400 на list.ru Mon Jan 24 20:54:00 2011 From: rg-400 на list.ru (rg-400) Date: Mon, 24 Jan 2011 19:54:00 +0300 Subject: [cdev] hash table In-Reply-To: References: <4D1882D3.4030100@komitex.ru> Message-ID: <4D3DAEA8.4050806@list.ru> В hash_table_replace У вас есть в tabel указатель на функцию compare. А вы пишите: b->key != key. А если table->table[idx] содержит значение NULL и проверку b->key != key ( заменим на compare(b->key, key) != 0) проводить нельзя? while(b->key != key) { if (b->next == NULL){ return -1; }else{ b = b->next; } } Т.е. функцию нужно бы исправить. /* ищем первое совпадение в списке, если совпадений нет, то список просто закончится и очень просто сделать вывод был ли в списке ключ(сравнить b с нулевым указателем) */ for (b = tabel->tabel[idx]; b != NULL; b->next) { if (*(tabel->compare)(b->key, key) == 0) break; } if (b == NULL) return -1; b->value = data; From sitkarev на komitex.ru Mon Jan 24 20:59:54 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Mon, 24 Jan 2011 19:59:54 +0300 Subject: [cdev] hash table In-Reply-To: <4D3DAEA8.4050806@list.ru> References: <4D1882D3.4030100@komitex.ru> <4D3DAEA8.4050806@list.ru> Message-ID: <4D3DB00A.70406@komitex.ru> Егор, они не проверяли. -- Г.А. rg-400 пишет: > В hash_table_replace > > У вас есть в tabel указатель на функцию compare. > А вы пишите: b->key != key. > > А если table->table[idx] содержит значение NULL > и проверку b->key != key ( заменим на compare(b->key, key) != 0) > проводить нельзя? > > while(b->key != key) { > if (b->next == NULL){ > return -1; > }else{ > b = b->next; > } > } > Т.е. функцию нужно бы исправить. > > /* ищем первое совпадение в списке, если совпадений нет, то список > просто закончится и очень просто сделать вывод был ли в списке > ключ(сравнить b с нулевым указателем) */ > > for (b = tabel->tabel[idx]; b != NULL; b->next) { > if (*(tabel->compare)(b->key, key) == 0) > break; > } > > if (b == NULL) > return -1; > > b->value = data; > > From hostip на mail.ru Tue Jan 25 03:31:57 2011 From: hostip на mail.ru (=?koi8-r?Q?=E4=C5=CE=C9=D3_=ED=D9=D3=CF=D7?=) Date: Tue, 25 Jan 2011 02:31:57 +0300 Subject: [cdev] hash table In-Reply-To: <4D3DB00A.70406@komitex.ru> References: <4D1882D3.4030100@komitex.ru> <4D3DAEA8.4050806@list.ru> <4D3DB00A.70406@komitex.ru> Message-ID: вроде поправили. просмотрите iter deinit, что он точно должен делать? мы примерно его написали. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 11515 bytes Desc: отсутствует URL: ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: отсутствует Type: application/octet-stream Size: 1685 bytes Desc: отсутствует URL: From rg-400 на list.ru Tue Jan 25 04:15:07 2011 From: rg-400 на list.ru (rg-400) Date: Tue, 25 Jan 2011 03:15:07 +0300 Subject: [cdev] hash table In-Reply-To: References: <4D1882D3.4030100@komitex.ru> <4D3DAEA8.4050806@list.ru> <4D3DB00A.70406@komitex.ru> Message-ID: <4D3E160B.9070801@list.ru> В hash_table_destroy prev не нужен и , т.к. массив tabel состоит из структур, можно сразу обратиться к нужному полю без плясок с адресами. for (cur = (*table)->table[idx].next; cur != NULL; cur = next) { next = cur->next; free(cur); } В hash_table_iterate_init выделили память 1 раз (под структуру), а в deinit 2 вызова free. Очищать, то что было в памяти не нужно, нужно лишь освободить занятую память(ту, которую выделял malloc`ом) From kzhevanv на rambler.ru Sat Jan 29 17:54:32 2011 From: kzhevanv на rambler.ru (=?koi8-r?B?88XSx8XK?=) Date: Sat, 29 Jan 2011 16:54:32 +0300 Subject: [cdev] =?koi8-r?b?5NfV09fR2s7ZyiDT0MnTz8s=?= Message-ID: Григорий Александрович, проверьте пожалуйста. Автор:Кожеванов Сергей. ----------- следущая часть ----------- A non-text attachment was scrubbed... Name: ds.zip Type: application/zip Size: 2216 bytes Desc: отсутствует URL: From sitkarev на komitex.ru Sat Jan 29 18:15:31 2011 From: sitkarev на komitex.ru (Grigoriy A. Sitkarev) Date: Sat, 29 Jan 2011 17:15:31 +0300 Subject: [cdev] =?utf-8?b?0JTQstGD0YHQstGP0LfQvdGL0Lkg0YHQv9C40YHQvtC6?= In-Reply-To: References: Message-ID: <4D442103.5080902@komitex.ru> Сергей, тебе надо было для начала это самому проверить. И подумать -- а можно ли таким API пользоваться на практике? Боюсь тебя разочаровать, но на деле этот код совершенно бесполезен. 1. list_free() должна высвобождать память для всех элементов списка. 2. list_add_data() должна добавить данные в список, т.е. создать структуру list_item, прицепить к ней данные и поместить в список. 3. list_del_data() в таком случае должна найти в списке элемент с данными, которые пользователь хочет удалить, извлечь этот элемент из списка и высвободить память, которую занимала структура этого элемента. Возможно, стоит переделать интерфейс -- код возврата сделать int а не void, как булево значение, был найден такой элемент или нет. 4. list_add() должна делать так чтобы список был циклическим, если ты подумаешь хорошо, то окажется что здесь есть одно большое преимущество. 5. list_unlink() сразу получает указатель на элемент списка, не надо ничего там искать, ты можешь извлекать его немедленно. 6. list_nth() понял верно, но нужно перепроектировать, написано жутко. 7. list_sort() работать не будет -- нет проверки на больше-меньше, только на неравенство. 8. Нужно тебе самому написать тесты, где будут проверяться все функции. Также как мы делали это с хеш-таблицей. То что оно компилируется это ещё ничего не значит. Есть над чем потрудиться. Я бы ещё тебе за стиль пару замечаний сделал, он у тебя неоднороден, хотя-бы с этого начнём. Впрочем, это уже вторично. -- Г.А. Сергей пишет: > Григорий Александрович, проверьте пожалуйста. > > Автор:Кожеванов Сергей.