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 Денис Лочмелис

v0.9: код полностью написан, но mergesort не работает на уровне UB.

comment:2 Changed 5 years ago by Денис Лочмелис

v1.0: вроде все работает. Из-за sscanf'а нельзя вводить слишком длинные строки (больше 32 символов).

comment:3 Changed 5 years ago by Sokolov Viacheslav

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.02.0

Установил ~linux (на самом деле WSL). Теперь смог проверить все sanitizer'ом, стало намного легче.

Теперь практически все работает, остались только 2 проблемы:
1) я не смог нормально сделать зависимости от заголовочных файлов (но в остальном Makefile поправил)
2) почему-то строки на некоторых примерах (135 13 61) неправильно сортируются

comment:5 Changed 5 years ago by Sokolov Viacheslav

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

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 кода

Note: See TracTickets for help on using tickets.