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 abramov.nikita

Summary: WW #1WW #4

comment:2 Changed 5 years ago by Sokolov Viacheslav

компараторы: потерян const
return strcmp(*(CONST char**)first_str, *(CONST char**)second_str);, нет проверок на NULL

результат вызова malloc(0) не специфирован
https://en.cppreference.com/w/c/memory/malloc

If size is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage, but has to be passed to free).

Если 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 (на Ваше усмотрение)

comment:3 Changed 5 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления

comment:4 Changed 5 years ago by abramov.nikita

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:5 Changed 5 years ago by Sokolov Viacheslav

Resolution: задача сдана
Status: assignedclosed

в других компараторах при преобразовании указателей теряется константность

Было бы хорошо вынести "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.