Opened 5 years ago
Closed 5 years ago
#323 closed ожидается проверка (задача сдана)
WW #4
Reported by: | abramov.nikita | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_mergesort | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 5 years ago by
Summary: | WW #1 → WW #4 |
---|
comment:2 Changed 5 years ago by
comment:3 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:4 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:5 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
в других компараторах при преобразовании указателей теряется константность
Было бы хорошо вынести "Error: memory allocation failed" в отдельную именнованную константу, чтобы избежать дублирования (а вдруг поправить захочется?)
Случай argc==2 по условию разрешен (0 аргументов какого-то типа). В финальной версии он обрабатывается неправильно.
26 void * buf = malloc(element_size * half_elem); 27 if (mergesort(array, half_elem, element_size, comparator) == -1 || 28 mergesort(array + half_elem * element_size, elements - half_elem, element_size, comparator) || 29 buf == NULL) { 30 return -1; 31 }
здесь проверку на buf == NULL лучше было бы вынести в начало - если память не удалось аллоцировать, дальше делать ничего не нужно
Сложение void* с числами осталось:
34 char * array2 = array + element_size * half_elem;
Note: See
TracTickets for help on using
tickets.
компараторы: потерян const
return strcmp(*(CONST char**)first_str, *(CONST char**)second_str);
, нет проверок на NULLрезультат вызова malloc(0) не специфирован
https://en.cppreference.com/w/c/memory/malloc
Если argc==2, он может происходить, чего лучше избежать
В реализации mergesort:
можно использовать shirt-circuit computation https://en.cppreference.com/w/c/language/operator_logical , чтобы сократить количество if ... return -1
Про void* +1 https://stackoverflow.com/a/3524270
Реализацию merge можно упростить, сделав один while, предположение которого - один из указателей еще не достиг границы (метод двух указателей). Будет меньше дублирования кода. Может быть удобно поддерживать не i, ptr2 (названия, кстати, не говорящие и ассиметричные), а полноценные char* ptr1, char* ptr2. Это тоже улучшит производительность: сейчас много умножений, а можно и без них.
38 buf = my_memcpy(buf, array, (elements / 2) * element_size);
buf = можно стереть; my_memcpy вполне может быть void (на Ваше усмотрение)