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)

x.1.core (1 bytes) - added by Дмитрий Свиридкин 4 years ago.
00_to_ff.core (256 bytes) - added by Дмитрий Свиридкин 4 years ago.

Download all attachments as: .zip

Change History (8)

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

Пишите тесты.

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

разархивирование не работает -> получается пустой файл.

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

Attachment: x.1.core added

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

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

comment:3 Changed 4 years ago by luchinin.aleksey

Owner: changed from luchinin.aleksey to Дмитрий Свиридкин
Type: ожидаются исправленияожидается проверка
Version: 1.02.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 luchinin.aleksey

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

Исправил недочёты

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

Resolution: задача сдана
Status: assignedclosed
  • 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

Note: See TracTickets for help on using tickets.