#81 closed ожидается проверка (задача сдана)
WW #3
Reported by: | antonenko.mixail | Owned by: | Святослав Власов |
---|---|---|---|
Component: | WW_mergesort | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (11)
comment:1 Changed 3 years ago by
comment:2 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Корректность -- 0/7. Не реализовано консольное приложение.
Дочитай и сделай задание до конца.
Стиль -- 0/3
- Инклюд гарды?
- Пробелы вокруг арифметических операций? Прочитай внимательно абзац "Про стиль" на https://emkn.ru/courses/2020-autumn/2.20-lang_c_low_level_programming/
- free(NULL) -- бессмысленная операция.
- l <<= 1, круто что ты знаешь семантику побитового сдвига, но лучше писать l *= 2
- Длинные строки (>80 символов) лучше разбивать на несколько.
- Давай для переменных вроде l, u1, u2, v1, v2, p1, p2 придумаем более говорящие имена. Если l у тебя обозначает длину промежутка, то лучше назвать её length или chunk_size, вместо u и v лучше использовать up/bottom или left/right. Для остальных переменных тоже стоит придумать более говорящие имена.
comment:3 Changed 3 years ago by
Я не очень понял, зачем вручную освобождать память, когда умираешь. Система же обычно делает это.
Потому что код, который вызывает функцию mergesort, может решить не падать при нехватке памяти, а сделать что-то другое. Поэтому mergesort должна гарантировать, что вся выделенная ей память будет освобождена вне зависимости от результата её работы.
comment:4 Changed 3 years ago by
Удивила часть про консольное приложение. Почему-то svn проигнорировала main.c.
- Инклюд гарды.
- Теперь.
- Да, есть такое.
- Хорошо.
- Хорошо.
- Пока что не делал.
Да, вопрос в такой постановке действительно тупой. Видимо, я думал про free в main'е, когда это писал.
comment:5 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:6 Changed 3 years ago by
- А не вариант просто рядом с объявлениями пояснять, за что отвечает та или иная переменная? Мне казалось логичным делать длины имён пропорциональными времени жизни; ну да и плотный код с переменными, каждая из которых занимает половину строки, тоже тяжело читать.
comment:7 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|---|
Version: | 1.0 → 2.0 |
Корректность 0/7
- Валгринд рассказывает про definitely lost bytes -- формально это сразу 0/7.
- Вызов программы с пустым списком приводит к крашу
Стиль -- 0/3
- По прежнему не вижу пробелов вокруг арифметических операторов.
- По прежнему вижу строки по >100 символов
- Верно, что чем короче время жизни переменной, тем меньше можно заморачиваться по поводу её имени, но когда на небольшом участке кода у тебя скапливается куча переменных с именами вроде u1, v1, p2, l, m, a и т.д., это сильно понижает читабельность кода. Такого нужно избегать. От того, что ты u1 и v1 заменишь на left_1 и right_1, твой код сильно не разрастется, но читаемость повысится в разы. Сделай имена переменных более осмысленными.
- Твой вариант создания массива строк с поиском максимальной длины и копирования строк в один большой массив избыточен. Это оверхед по памяти (представь тест где одна строка длиной в тысячу символов и тысяча строк длиной в 1 символ) и бессмысленное лишнее копирование самих строк. Вместо этого сделай так, чтобы в в массиве хранились не сами строки, а указатели на них, и чтобы сортировались тоже указатели, а сами строки в памяти лишний раз не перемещались.
- Функция должна называться mergesort, а не my_mergesort.
comment:8 Changed 3 years ago by
- Не получилось воспроизвести.
- Исправлено.
2, 5. Может быть, теперь.
- Готово.
- Готово.
- Я бы и рад, но компилятор жалуется на клэш со стандартной библиотекой.
comment:9 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:10 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Всё ок, с бонусом 11/11
Единственное замечание -- копировать строки в отдельный массив избыточно. Можно было просто передать argv в mergesort.
На будущее -- не добавляй ключ -fsanitize=address в дефолтную сборку, он сводит с ума валгринд, а это ломает тесты, и когда засылаешь исправления на проверку меняй пожалуйста версию тикета самостоятельно.
Я не очень понял, зачем вручную освобождать память, когда умираешь. Система же обычно делает это.