Opened 4 years ago
Closed 4 years ago
#937 closed ожидается проверка (задача сдана)
HW #3
Reported by: | Obryadina Alexandra | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | HW #3 (Huffman) | Version: | 3.0 |
Keywords: | Cc: |
Description
Attachments (2)
Change History (5)
Changed 4 years ago by
Attachment: | compress.err added |
---|
Changed 4 years ago by
Attachment: | 00_to_ff.core added |
---|
comment:1 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Obryadina Alexandra |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Obryadina Alexandra to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
bool operator() (HuffmanNode* a, HuffmanNode* b) { return a->freq > b->freq; }
оператор нужно пометить const. Иначе не обязано компилироваться.
priority_queue
-- это внутренность дерева, нужная только для его построения. Класс дерева не должен его отдавать никому. Для итогового представления дерева она не нужна. Лучше и достаточно только указателя на корень.
По условию нужен двухпроходной алгоритм без чтения всего файла в память.
Все файлы надо открывать в бинарном режиме.
Сложную вложенность с перехватом исключений можно упростить с помощью https://en.cppreference.com/w/cpp/language/function-try-block
if (i == argc - 1 || !strcmp(argv[i + 1], "-c") || !strcmp(argv[i + 1], "-u") || !strcmp(argv[i + 1], "-f") || !strcmp(argv[i + 1], "--flag") || !strcmp(argv[i + 1], "-o") || !strcmp(argv[i + 1], "--output")) {
Поскольку после флага -f / --file может быть только имя файла, все, кроме первого условия (i == argc -1
) не нужно. "-c" -- вполне себе законное имя файла в unix! Для флага -o то же самое.
extr.extract(inputStream, outputStream); return extr.getInfoSize();
Можно в методе extract так же вернуть размер. Хранить его полем класса особой необходимости нет.
Чтение по одному биту с формированием строки и проверка вхождения этой строки в таблицу кодов после каждого бита -- очень неэффективно. Лучше использовать дерево: переходить от узла к узлу и выдавать байт, если достигли листа. Эту логику можно завернуть в какой-нибудь класс TreeWalker
c методом std::optional<byte> Consume(bit)
Для построения дерева не нужен весь исходный файл. Нужна только таблица частот. Логику ее построения стоит держать отдельно от дерева.
Тесты довольно слабые. Только дерево с 2-3 вершинами (с учетом корневой). Так совсем не проверить, что коды получаются верными.
Еще нужны тесты кодирования/раскодирования одного символа с помощью построенного дерева.
И тесты чтения и записи вспомогательной информации.
Читалки битов также можно отделить и протестировать.
На последней версии: проблемы со статистикой и длиной кода (на ранее приложенном файле воспроизводится). Длина сжатых байтов (без доп информации) не может получаться больше чем длина исходного файла из-за правила построению дерева.
5 + 3 + 1.5 + 6
что-то у вас тесты текут
На пустом файле все упало. В логе отрицательные размеры.
При разархивировании файл становится больше, чем исходный.
В статистику может выводиться неправильный размер исходного файла.
На приложенном файле не работает архивирование-разархивирование.
Прекрасный скопипащенный дважды текст в тестах поместите в переменную.
Протестируйте на бинарных файлах.
А зачем булев флаг? (лучше давать осмысленное имя, а не просто flag) Вам просто нужно сделать
return EXIT_FAILURE
, а не увеличивать уровень вложенности кода.У вас две функции: doCompress() и doExtract(). Что нужно делать, если обе вернут true? Функция для выбора одного из двух взаимоисключающих действий должна быть одна.
Расставьте const у методов, где это уместно.
Конструктор дерева не создает готовое к использованию дерево. Требуется дополнительный вызов метода makeHuffmanTree. Вместо деструктора -- вызов другого метода. Как-то это не правильно. не по-RAII.
Зачем ссылки?
Детально код не проверял, поскольку пока не работает. Только самое заметное.
Используйте умные указатели, не надо мучать память вручную. Захватывайте ресурсы и делайте готовый к работе объект в конструкторе, освобождайте в деструкторе.