Opened 4 years ago
Closed 4 years ago
#929 closed ожидается проверка (задача сдана)
HW #3
Reported by: | luchinin.aleksey | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | HW #3 (Huffman) | Version: | 3.0 |
Keywords: | Cc: |
Description
Не написал тесты
Attachments (2)
Change History (8)
comment:1 Changed 4 years ago by
Changed 4 years ago by
comment:2 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to luchinin.aleksey |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:3 Changed 4 years ago by
Owner: | changed from luchinin.aleksey to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 1.0 → 2.0 |
Исправил недочёты
Changed 4 years ago by
Attachment: | 00_to_ff.core added |
---|
comment:4 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to luchinin.aleksey |
---|---|
Type: | ожидается проверка → ожидаются исправления |
А получающиеся коды протестировать?
Статистика архивирования выводится не правильно. Требуется выводить отдельно размер доп. данных и размер сжатых данных. Размер итогового файла выводить не нужно.
Для пустого файла размер сжатых данных (без вспомогательных) -- 1 байт. Там быть не должно.
На файле из одного символа не работает
На файле, в котором используется только один символ, не работает
На приложенном файле (все байты по одному разу) не работает разархивирование.
На каких-то файлах работает (например, на main.cpp), но в основном не работает.
Парсер командной строки не должен запускать алгоритм. Его задача только распарсить аргументы.
А исключения кто ловить будет?
Расставьте const, где это уместно. В компараторе, например.
У HaffmanArchiver? два пумбличных метода. Но вызывать их друг за другом нельзя. Все сломается.
Надо их либо расцепить, либо состояние потоков передавать в их аргументы.
std::shared_ptr<HuffmanNode> HuffmanNode::get_child(int pos) const noexcept
У этого метода допустимо только два значения аргумента. Может, enum?
Конструктор дерева не строит дерево. У вас это делает метод build. А зачем тогда конструктор?
Логику чтения по одному битику стоит вынести в отдельную обертку.
Разархивирование c поочередным добавлением одного символа и поиком по таблице кодов -- крайне не эффективно. Используйте дерево: обрабатывая по одному биту, переходите от вершины к вершине, пока не упретесь в лист -> выдавайте байт.
constexpr size_t SIZE_SIZE_T = 8;
Вы, похоже, совсем не доверяете компилятору. sizeof.
HuffmanArchiver::~HuffmanArchiver() { ifstr.close(); ofstr.close(); }
Деструкторам потоков, похоже, тоже не доверяете.
Вспомогательные данные какие-то у вас слишком большие. Вероятно, неправильно записанные.
256 байт. По 8 байт на каждый для статистики. Должно получаться не больше чет 2048 байт.
А на приложенном файле - 2500+.
3 + 4 + 1.5 + 7
comment:5 Changed 4 years ago by
Owner: | changed from luchinin.aleksey to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
Исправил недочёты
comment:6 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
cnt_extra_bytes += __SIZEOF_SIZE_T__;
Чем sizeof не угодил? Зачем эти специфичные макросы?
- Логику вычитывания по битику точно нужно отделить.
bool operator()(const std::shared_ptr<HuffmanNode> first, const std::shared_ptr<HuffmanNode> second);
Оператор должен быть const. Иначе компилироваться не обязано.
*
HuffmanTree(std::vector<size_t> &frequencies); std::unordered_map<uint8_t, std::string> build();
Конструирование оторвано от конструктора.
- У вас два класса HuffmanTree? внутри одного неймспейса. Это ODR Violation. Код работает просто по чистой случайности.
- Чтение и запись вспомогательных данных не проверяется. Подсчет частот по потоку не проверяется. Для таблицы кодов проверяется только число элементов в ней. Сами значения не проверяются.
6.5 + 6 + 3 + 7.5
Пишите тесты.
Для пустого файла нет статистики.
разархивирование не работает -> получается пустой файл.