Opened 5 years ago
Closed 5 years ago
#390 closed ожидается проверка (задача сдана)
WW #4
Reported by: | kozubaev.nurmukhammad | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | WW_mergesort | Version: | 3.0 |
Keywords: | Cc: |
Description
Что то с этой лабой дела пошли не очень. Из-за контрольных и сессии не смог достаточно уделить время. Знаю что опоздал, и что баллов скорее всего не будет. Но был бы рад, если вы смогли бы помочь с решением Segmentation fault error.
Change History (5)
comment:1 Changed 5 years ago by
Owner: | changed from Egor Suvorov to kozubaev.nurmukhammad |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 5 years ago by
Owner: | changed from kozubaev.nurmukhammad to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
Добавил вывод. Свой memcpy(добавил в mergesort.h). По стилю : исправил все, кроме 3 и 4. В 3 сделал новые более понятные имена переменных. Реализацию mergesort не менял.
comment:3 Changed 5 years ago by
Owner: | changed from Egor Suvorov to kozubaev.nurmukhammad |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность (баллы пока не ставлю, переоткройте тикет, чтобы поставил):
merge_sort
-->mergesort
myMemcpy
нужен только вmergesort.c
=> не надо его объявлять вmergesort.h
.- Не работает на пустых массивах.
Стиль:
- Не объявляйте переменные в начале функции. Объявляйте их только там, где они нужны. А конкретно
element_size
вmain
вообще не нужен. myMemcpy
-->my_memcpy
(в Си принятsnake_case
).my_mem_cpy
-->my_memcpy
.unsigned int
вmy_mem_cpy
-->size_t
для симметрии с аргументами.cmp-t
не нужен.- Возьмите автоформаттер с ограничение на длину строки побольше, а то переносы строк в
compare_int
вообще не смотрятся. else { return; }
— бесполезная конструкция в конце функции.merge_sort
:number_of_elements
-->elements
илиelements_count
.size_of_subarray
— не точно. Подмассивов у нас много. Лучше, например,left_size
или, ещё лучше,left_elements
(чтобы подчеркнуть, что это количество элементов, а не байт).- Лишние пробелы между
*
и указателем. my_mem_cpy
используется только один раз => возможно, лучше убрать. Как хотите.
comment:4 Changed 5 years ago by
Owner: | changed from kozubaev.nurmukhammad to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:5 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Баллы за корректность — 6/7.
Баллы за стиль — 1.5/3 плюс допбалл за изящное решение на указателях.
Итого 8.5/10.
Можете дорешать, если хотите — просто переоткройте тикет.
А где у вас segmentation fault? Добавить вывод ответа — и версия 1445 все наши тесты проходит даже под Valgrind. Да и код более-менее корректно выглядит.
merge
так вообще очень ловко и изящно сделали на одних указателях без индексов. Прям круто, я про такое раньше не думал. Добавлю за это допбалл по стилю, если сдадите корректность.Так что добавляйте вывод ответа (желательно пробел в конце строки не выводить, это +0.5 по корректности) и получайте свои баллы :)
Итого корректность:
mergesort.h
надо не свойtypedef
делать, а подключать стандартный заголовок<stddef.h>
, в котором объявленsize_t
. Он не всегда равенunsigned long
.memcpy
— это хорошо, но в задании надо всё копирование элементов делать руками (как вы делаете вwhile
.По стилю:
for
и(
, пройдитесь автоформаттером.merge
— лучше не вычислять тутsize
заново, а передать его изmergesort
. Меньше кода синхронизировать => меньше шансов посадить баг.elements
/size
/split
— названия путаются. Стоит как-то назвать так, чтобы было ясно, что это: а) названия; б) чем между собой отличаются; в) нельзя было случайно вместо одного написать другое. Одна из идей: давайтеmerge
будет приниматьp1
,p2
иdest
, три разных массива, и их длины. Тогда получится очень красивыйmerge
. Аmergesort
уже будет выделять временную память и что-то куда-то копировать.i
не используется. Для симметрии, наверное, нужна, но тут лучше напрямую сравнитьp2
с концом массива. Будет чуть изящнее, мне кажется.mergesort
лучше сделать early return: неif (elements > 1) { ... }
, аif (elements <= 1) return; ... }
StrCmp
/CompareInt
— в Си принятsnake_case
.StrCmp
уже есть в стандартной библиотеке почти с таким названием, возьмите оттуда. Тем более что вы его и так используете, а не свою реализацию.main
сделайте цепочку изelse if
, а в конце поставьтеelse assert(!"Unknown type to sort")
— чтобы не заглушалась ошибка "пользователь передал не тот тип в качестве первого параметра". Если передаст — сработает веткаelse
, а в ней —assert
, который всегда падает.