Opened 5 years ago

Closed 5 years ago

#320 closed ожидается проверка (задача сдана)

WW #4

Reported by: sukhodolskiy.maksim Owned by: Sokolov Viacheslav
Component: WW_mergesort Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 5 years ago by Sokolov Viacheslav

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

Больше внимания проверке контрактов! Указатели ненулевые везде, не так ли?
comparator != NULL? element_size == 0 допустим? что, если (elements + 1) * element_size переполняется? еще пост-условие можно проверить (массив отсортирован)э

Чем мотивирован выбор типа?
50 int m = (l + r) / 2;

memcpy по условию запрещен.

Все операции, связанные с копированием памяти, надо реализовать самостоятельно.

Бонус: exit(1) запрещен.

Делать эти действия разрешается только в функции main.

Чем мотивирован "return -1" из main?

реализацию merge можно упростить, оставив один while (!(i == m - l && j == r - m)). Придется добавить условий внутрь цикла, зато не будет дублирования кода.

comment:2 Changed 5 years ago by sukhodolskiy.maksim

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

comment:3 Changed 5 years ago by Sokolov Viacheslav

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

Можно было бы избежать дублирования строки
"Error: memory allocation failed.\n" (вынести ее в именованную константу)

В mergesort: контракт assert(elements > 0); не выполняется, если запустить на тесте "char" программа падает по ассерту.

9 *(char *) (destination + i) = *(char *) (source + i);
некорректно: https://stackoverflow.com/a/3524270
(у Вас destination и source - void* , порядок операций должен быть другой:
*((char *) destination) + i) = *((char *) source) + i);

73 long long mem_size = 1ll * (elements + 1) * element_size;
лучше сделать так
73 long long mem_size = (elements + 1ll) * element_size;
но это все равно не соответствует Стандарту:
size_t может (и часто будет) совпадать с типом uint_64_t, так что от такого преобразования только хуже (UB: переполнение знакового типа). Отсутcтвие переполнение корректно проверяется иначе: SIZE_MAX / element_size > elements

 84     for (size_t i = 0; i < elements - 1; i++) {
 85         int is_bigger = comparator(array + i * element_size, array + (i + 1) * element_size);
 86         assert(is_bigger <= 0);
 87     }

стоило бы вынести в отдельную функцию. Тогда в release сборке он бы вырезался целиком, а так останутся бесполезные операции.

реализацию merge можно упростить, оставив один while (!(i == m - l && j == r - m)). Придется добавить условий внутрь цикла, зато не будет дублирования кода.

дублирования остались (6 одинаковых вызовов my_memcpy), цель не достигнута

Лайк за 1 аллокацию на весь mergesort.

Note: See TracTickets for help on using tickets.