Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#924 closed ожидается проверка (задача сдана)

HW #3

Reported by: lebedev.egor Owned by: Дмитрий Свиридкин
Component: HW #3 (Huffman) Version: 3.0
Keywords: Cc:

Description

Оно даже работает!

Attachments (2)

Screenshot_20200419_120405.png (41.7 KB) - added by Дмитрий Свиридкин 4 years ago.
err.log (34.8 KB) - added by Дмитрий Свиридкин 4 years ago.

Download all attachments as: .zip

Change History (15)

comment:1 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to lebedev.egor
Type: ожидается проверкаожидаются исправления

Давненько не было рукописных Makefile...

У бинаря с тестами имя неправильное.

Табы и пробелы перемешаны. Настройте IDE на автозамену табов на пробелы. Сейчас тут адски вырвиглазное выравнивание в исходниках, что проверять невозможно.

Под windows будет портить файлы.

Для пустого файла не выводится статистика.

Возможно, даже работает.

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:2 Changed 4 years ago by lebedev.egor

Хм, я пофиксил все, что тут было написано, не хотелось бы переводить это в следующую попытку...

И еще вопрос: а в какой момент под windows будет портить файлы (и зачем нужен windows)?

comment:3 Changed 4 years ago by lebedev.egor

Type: ожидаются исправленияожидается проверка

Меняю статус на "ожидается проверка", чтобы подать сигнал, что тут есть коммент выше

comment:4 Changed 4 years ago by lebedev.egor

Owner: changed from lebedev.egor to Дмитрий Свиридкин

Видимо еще вот так надо сделать

comment:5 in reply to:  2 Changed 4 years ago by Дмитрий Свиридкин

Replying to lebedev.egor:

И еще вопрос: а в какой момент под windows будет портить файлы (и зачем нужен windows)?

В произвольный момент, в зависимости от содержимого файла. У вас платформозависимое решение.

Changed 4 years ago by Дмитрий Свиридкин

comment:6 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to lebedev.egor
Type: ожидается проверкаожидаются исправления

Формамирование не исправлено. Табы и пробелы все так же перемешаны (см. скриншот).
Включите отображение непечатаемых символов и отформатируйте все файлы.

Нет тестов на построение дерева по таблице частот.

В тесте check_archive_and_extract не проверяется равенство файлов. Подумайте почему.

8 + 5 + ? + ?

Следующую попытку переводите в "следующую попытку".

comment:7 Changed 4 years ago by lebedev.egor

Owner: changed from lebedev.egor to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.0

С форматированием произошла какая-то беда, я его точно исправлял, извиняюсь :(

  • Сейчас форматирование поправил
  • Добавил тест на корректность построение дерева (по факту получения кодов из дерева) по таблице
  • Добавил тестик на 5MB
  • Протестил на 3 оперционках, все работает
  • На винде отдельно потестил именно на файлах, теперь все работает (это было больно)
  • Исправил check_archive_and_extract

comment:8 Changed 4 years ago by Дмитрий Свиридкин

Owner: changed from Дмитрий Свиридкин to lebedev.egor
Type: ожидается проверкаожидаются исправления

size_t CLI::getIndex(std::string s1, std::string s2 = {}) const;

Метод хоть и приватный, но совершенно не понятно, что это за аргументы.

HuffmanNode(std::unique_ptr<HuffmanNode>& left, std::unique_ptr<HuffmanNode>& right);

Конструктор захватывает владение указателями. unique_ptr некопируем -- должны быть rvalue ссылки.

HuffmanNode(std::pair<int, uint8_t> pair); Ну пара. А что это за пара?

friend bool operator<(HuffmanNode& first, HuffmanNode& second); const?

Расставьте const там, где это уместно.

const std::vector<std::pair<std::vector<bool>, uint8_t>>& Заверните это безобразие в собственнуб структуру CodeTable с интерфейсом, позволящим выполнять преобразование кодов.
Типы из стандартной библиотеки не очень подходят для сложных структур. Особенно std::pair.

У вас вроде 17 стандарт -- используйте string_view вместо сырых указателей на char.
structure bindings для итерирования по контейнеру пар и т.д.

* little endian размер блока с кодом для каждого символа - 2 байта У вас максимум 256 символов. Если дерево выродится в бамбук (список с одним листом в каждом узле), вам точно хватит двух байт?

Код статических методов compress/decompress надо разбить на отдельные шаги. Ввести необходимые сущности (таблица символов, таблица частот) с методами чтения/записи в файл.
Логику чтения и записи по одному биту/байту тоже надо вынести в отдельные структуры. И протестировать их.


8 + 5 + 1.5 + 4

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:9 Changed 4 years ago by lebedev.egor

* little endian размер блока с кодом для каждого символа - 2 байта У вас максимум 256 символов. Если дерево выродится в бамбук (список с одним листом в каждом узле), вам точно хватит двух байт?

Это число, которое описывает размер блока, занимает 2 байта; думаю 65 тысяч битов (кажется, даже байт) точно хватит.

  • Где-то все еще остались проблемы с корректностью? Или почему 8/9?
  • Правильно ли я понимаю, что за тесты сейчас 5 из-за последнего пункта? Или у них тоже отдельные проблемы есть
  • Еще вопрос: нормально ли делать "итератор по дереву" который тупо по массиву с кодами проходит?
Last edited 4 years ago by lebedev.egor (previous) (diff)

comment:10 in reply to:  9 Changed 4 years ago by Дмитрий Свиридкин

Это число, которое описывает размер блока, занимает 2 байта; думаю 65 тысяч битов (кажется, даже байт) точно хватит.

Ок. Считайте, что этот минус за документацию, из которой не сразу ясно, что вы храните:
[кодируемый байт][блок с кодом; фиксированного размера, размер указывается в заголовке файлу]

  • Правильно ли я понимаю, что за тесты сейчас 5 из-за последнего пункта? Или у них тоже отдельные проблемы есть

У вас есть только тесты построения дерева и end-to-end тесты. Тестов проверки полученных кодов нет (только размеры вроде проверяете). Есть еще парсер аргументов, чтение и запись вашего формата. Раскодирование одной строчки кода.

  • Еще вопрос: нормально ли делать "итератор по дереву" который тупо по массиву с кодами проходит?

Почему бы и нет. Что у вас там в приватных кишках -- без разницы. Можно честно по листьям дерева проитерироваться. Можно сделать проще и проитерироваться по предпросчитанному массиву.

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)

comment:11 Changed 4 years ago by lebedev.egor

Owner: changed from lebedev.egor to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 2.03.0

Что произошло:

  • Добавил битовый поток
  • Довольно сильно порефакторил код
  • Добавились тесты
  • Появилась парочка самописных итераторов
  • Все структуры типа pair<pair<pair<vector<pair<int, pair... переименованы и выделены в отдельные классы, теперь, смотря compress и extract, не очень хочется плакать
  • Вероятно, что-нибудь еще упустил, но в основном поправлял архитектуру, за которой следовал стиль, ну и тестов подкрутил
  • В пару мест вставил const еще

Changed 4 years ago by Дмитрий Свиридкин

Attachment: err.log added

comment:12 Changed 4 years ago by Дмитрий Свиридкин

Еще UB появилось. Смотрите лог.

comment:13 Changed 4 years ago by Дмитрий Свиридкин

Resolution: задача сдана
Status: assignedclosed
  • вложенность кода в main можно уменьшить с помощью function-try-block
  •     std::queue<std::unique_ptr<HuffmanNode>> initialNodes_, newNodes_;
    

Их, скорее всего, можно не делать полями класса. EncodingHuffmanTree?. Очереди нужны только для построения.
У вложенного класса Iterator выравнивание поехало.

  •     REQUIRE(std::distance(std::istreambuf_iterator<char>(input),
                              std::istreambuf_iterator<char>()) ==
                std::distance(std::istreambuf_iterator<char>(output),
                              std::istreambuf_iterator<char>()));
        CHECK(std::equal(std::istreambuf_iterator<char>(input),
                         std::istreambuf_iterator<char>(),
                         std::istreambuf_iterator<char>(output)));
    

equel вернет true, ничего не проверив


7.1 + 7 + 4.5 + 7.9

Last edited 4 years ago by Дмитрий Свиридкин (previous) (diff)
Note: See TracTickets for help on using tickets.