Opened 5 years ago
Closed 5 years ago
#242 closed ожидается проверка (задача сдана)
WW #4
Reported by: | Surkov Petr | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_mergesort | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (5)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Что, если кто-то другой позовет merge_sort?
может ли elements быть 0?
может ли element_size быть 0?
что, если element_size * elements переполняется?
больше const. В куче мест можно дописать const, сделайте это, пожалуйста, когда дойдем до c++ это будет совсем важно. В том числе в компараторах теряется константность:
return strcmp(*(CONST char**)a, *(CONST char**)b);
В my_memcpy, например, source не планируется модифицировать. И таких мест много.
Стоит вынести "Error: memory allocation failed" в именованную константу, чтобы не дублировать
эта ветка дублирует первый if
39 else {
40 my_memcpy(current, (char *)array + element_size * (mid + i2), element_size);
41 i2++;
42 }
можно добиться всего одного ветвления
Не принципиально, но можно вместо
63 if (merge_sort_recursive(array, mid, element_size, comparator) == -1 || 64 merge_sort_recursive(array + mid * element_size, elements - mid, element_size, comparator) == -1 || 65 merge(array, mid, elements, element_size, comparator) == -1) { 66 67 return -1; 68 } 69 return 0;
сделать
return merge_sort_recursive(array, mid, element_size, comparator) || merge_sort_recursive(array + mid * element_size, elements - mid, element_size, comparator) || merge(array, mid, elements, element_size, comparator);
comment:4 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:5 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Проверка контрактов! https://wiki.compscicenter.ru/index.php/C%2B%2B_1MIT_осень_1_2019#.D0.A2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BA.D0.BE.D1.80.D1.80.D0.B5.D0.BA.D1.82.D0.BD.D0.BE.D1.81.D1.82.D0.B8.2C_.D0.BF.D1.80.D0.B5.D0.B4.D1.8A.D1.8F.D0.B2.D0.BB.D1.8F.D0.B5.D0.BC.D1.8B.D0.B5_.D0.BA_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.B0.D0.BC
like за реализацию функции merge_sort
merge_sort_recursive: какая мотивация делать left, right, mid int, а не size_t?
Кроме того, можно будет просто написать
return error;
right - left стоит вынести в отдельную переменную.
В merge можно было бы передавать уже сдвинутый на left (или даже mid) указатель, это бы упростило реализацию функции.
Вместо
printf("%s\n", "Error: memory allocation failed");
можно простоprintf("Error: memory allocation failed\n");
malloc:
https://en.cppreference.com/w/c/memory/malloc
Так что сейчас случай n=0 не работает корректно.
Общая рекомендация: не использовать в качестве счетчика цикла int (зачем? int знаковый, а счетчик не должен принимать отрицательные значения).