Opened 4 years ago
Closed 4 years ago
#938 closed ожидается проверка (задача сдана)
HW #3
Reported by: | Vavilov Mark | Owned by: | Дмитрий Свиридкин |
---|---|---|---|
Component: | HW #3 (Huffman) | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 4 years ago by
Owner: | changed from Дмитрий Свиридкин to Vavilov Mark |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 4 years ago by
Owner: | changed from Vavilov Mark to Дмитрий Свиридкин |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
CMake Error at CMakeLists.txt:13 (add_executable): Cannot find source file: test/TestCli.h
Недокоммитили
- Файлы нужно открывать в бинарном режиме. Иначе под windows будет получаться мусор.
- Почему бы парсеру аргументов не вернуть структуру с распарсенными значениями?
- Почему бы методам compress/extract не вернуть структуру с посчитанной статистикой, а не делать это вручную в main?
- вложенность кода в main можно уменьшить с помощью function-try-block
- в случае ошибки программа не должна возвращать 0
- в флаге
--file
ошибка. - Построение priority_queue не должно быть частью публичного интерфейса. Это детали реализации конструктора дерева.
-
tree.add_HuffmanNode("00", 'a'); tree.add_HuffmanNode("01", 'b');
Этот метод может нарушить свойство префиксности кода. Лучше его убрать и предоставить конструктор, принимающий таблицу кодов (и кидающий исключение, если код не префиксный)
- Размещайте публичные поля и методы перед приватными. Приватные кишки никому не нужны.
- Логику перемещения по дереву (указатель на текущую вершину и т.д.) при декодировании лучше вынести в отдельный класс, с конструктором, принимающим дерево.
static int32_t zip(std::unordered_map<char, int>& letters, std::unordered_map<char, std::string>& dict);
Что делает эта функция? Из названия совершенно не понятно. Видимо, строит таблицу кодов. Но почему таблица частот передается по изменяемой ссылке? Почему бы этому методу не вернуть таблицу кодов через возвращаемое значение, а не менять аргументы?-
explicit HuffmanTree(my_queue HuffmanNode_queue); static my_queue priority_queue_with_HuffmanNodes( const std::unordered_map<char, int>& letters);
Зачем в публичном интерфейсе промежуточный шаг с очереднью? Почему бы конструктору не принимать таблицу частот?
- Функции compress/extract надо разбить на отдельные функцкии, выполняющие законченное действие:
- Построение таблицы частост для входного потока
- Построение дерева по этой таблице
- Кодирование входного потока
-
// remember stuff fout.write(reinterpret_cast<const char*>(&n), sizeof(n)); fout.write(reinterpret_cast<const char*>(&freq_sum), sizeof(freq_sum)); for (const auto&[ch, k] : dict) fout << ch << k << ' ';
Не надо смешавать бинарный и текстовый ввод/вывод. Это редко приводит к чему-то хорошему.
- Побитовое чтение/запись лучше выделить в отдельный класс-обертку над потоком.
7.5 + 5 + 3 + 6
Note: See
TracTickets for help on using
tickets.
/home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test/TestMain.cpp:7:10: fatal error: doctest.h: No such file or directory
вы пакет с doctest в cmake подтянули, но к таргетам с тестами не прицепили (для system-wide не обязательно, но раз вы используете cmake find_package -- то, по-хорошему, надо.)
target_link_libraries(...... doctest::doctest)
у doctest, находимого с помощью cmake, путь к заголовку: <doctest/doctest.h>
CHECK(size - n == 1e6 / 8);
слева int, справа -- double. Сравнение будет в double. Сравнивать double на точное равенство -- затея, обреченная на провал почти всегда. Два одинаковых числа могут быть не равны.
add_definitions("-D_GLIBCXX_DEBUG
зачем вам перманентно включать дебажный режим стандартной библиотеки? Для дебажных сборок запускайтеcmake -DCMAKE_BUILD_TYPE=Debug
Тесты протекли
На пустом файле не работает.
Обработка аргументов командной строки допускает некорректные ключи.
Инициализируйте переменные. zip может быть неинициализирован -> UB.
Под windows файлы будут испорчены.
#include <sys/stat.h>
вот давайте без платформоспецифичных заголовков. Посчитать размер файла не такая уж и сложная задача.Статическое поле класса для корня дерева, вы уверены, что это хорошая идея? А если нужно параллельно несколько разных файлов обработать?
Используйте умные указатели. Не надо мучать память вручную.
Расставьте const там, где это уместно.
Все методы статические и глобальное состояние -- в худших традициях Cи.
У вас только end-to-end тесты.
6 + 2 + 1 + 5