Opened 5 years ago
Closed 5 years ago
#275 closed ожидается проверка (задача сдана)
WW #4
Reported by: | Денис Лочмелис | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_mergesort | Version: | 2.0 |
Keywords: | Cc: |
Description
V0: минимальные требования для промежуточного срока сдачи. Планирую сегодня же добавить что-то более вразумительное.
Change History (5)
comment:1 Changed 5 years ago by
comment:2 Changed 5 years ago by
v1.0: вроде все работает. Из-за sscanf'а нельзя вводить слишком длинные строки (больше 32 символов).
comment:3 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Проблемы с Makefile такие же, как и в третьей лабораторной.
Не работает на примере из условия:
./lab_04 char z y x должно выдавать x y z
компараторы: потерян const
return strcmp(*(CONST char**)a, *(CONST char**)b);
, нет проверок на NULL
%256d не нужен, %d и так считает int
для получения char и str вовсе sscanf не нужен; в случае str и аллокация не нужна, можно сортировать argv.
Этот комментарий не нужен
86 / / elem_count is always >= 0 since it is unsigned
87 / / assert for this causes a warning
/ / cannot be negative, unable to assert
Этот комменатрий неверен, поставить assert можно. Но не нужно. n - n/2 >= n/2 и уж точно n >= n/2.
Еще можно проверить, что elem_size * part1_size не переполнится, а массив в конечном итоге отсортирован.
malloc может вернуть NULL, ставте assert хотя бы
Здесь if(part1_size == 0 && part2_size > 0)
и ниже лучше сделать так:
if (part2_size > 0) {assert(part1_size == 0);
Рекомендую получше потестировать перед следующей попыткой, третьей попытки может и не быть.
comment:4 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Установил ~linux (на самом деле WSL). Теперь смог проверить все sanitizer'ом, стало намного легче.
Теперь практически все работает, остались только 2 проблемы:
1) я не смог нормально сделать зависимости от заголовочных файлов (но в остальном Makefile поправил)
2) почему-то строки на некоторых примерах (135 13 61) неправильно сортируются
comment:5 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
27 mergesort.h: # to check if .h updated
в этом нет никакого смысла :)
каждая цель должна что-то делать, пустой рецепт равнозначен отсутствию цели.
Обновлялся ли файл или нет make будет проверять сам, для этого нужно установить файл в качестве зависимости следующим образом
obj/mergesort.o: include/mergesort.h
обращаю внимание, что ставить нужно до символа | , иначе зависимость будет order-only, то есть будет проверяться наличие файла, но не время его модификации
Сейчас пересборка не будет происходить корректно, в чем легко убедиться, запустив сборку после изменения какого-либо файла.
Цель remake может быть нужна, но не стоит злоупотреблять этим способом сборки, 90% сборок должно происходить с помощью просто make
Если есть трудности с make, предлагаю в личном порядке после какой-нибудь пары (или другим образом) обсудить все вопросы, например, заново проговорить, как работает make И как устроены Makefile.
В двух компараторах все еще теряется константность при cast-е указателей
%256c
не имеет никакого смысла: %c считает ровно один символ, модификатор 256 говорит "при этом просмотреть не более 256 символов". Чтобы считать один символ достаточно просмотреть 1 символ.
2) почему-то строки на некоторых примерах (135 13 61) неправильно сортируются
У меня отсортировалось правильно (13 135 61), проблем в коде также не вижу.
30 char* buf = (char*) malloc( (part1_size + part2_size) * elem_size);
part1_size + part2_size это arr_size
71 for(unsigned int i = 0; i < arr_size; i++){ 72 copy_elem(buf, arr, elem_size); 73 buf += elem_size; 74 arr += elem_size; 75 }
можно реализовать просто как
copy_elem(buf, arr, elem_size * arr_size);
В реализации merge к сожалению много copy-pasted кода
v0.9: код полностью написан, но mergesort не работает на уровне UB.