Opened 4 years ago

Closed 4 years ago

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

HW #3

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

Description

1 Там в одном месте Huffman.cpp есть закоменнтированная попытка использовать std::copy с моим итератором. Я не понимаю, почему оно не работает

2 Почему я не могу привести std::istreambuf_iterator<char> к std::iterator<std::input_iterator_tag, char>&? Он же наследуется от него. И так я мог бы принимать в методах Huffman более общий класс

Change History (5)

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

Replying to Roman Venediktov:

1 Там в одном месте Huffman.cpp есть закоменнтированная попытка использовать std::copy с моим итератором. Я не понимаю, почему оно не работает

Не работает из-за того, что итератор, хранит состояние целого массива и позицию в нем и копируется внутрь std::copy.
Если итератор будет хранить не состояние, а ссылку на состояние, скорее всего, будет работать.

2 Почему я не могу привести std::istreambuf_iterator<char> к std::iterator<std::input_iterator_tag, char>&? Он же наследуется от него. И так я мог бы принимать в методах Huffman более общий класс

Начиная с C++17 он не наследуется от std::iterator. std::iterator будет удален из стандартной библиотеки. Вместо него будут концепты.
Основная идея в том, что все алгоритмы над итераторами -- шаблонные функции. Им не нужен интерфейс базового класса, а только соответсвие какому-то концепту. Ну и std::iterator с его кучей параметров признан неудобным.


С пустым файлом не работает:

==100706== Invalid read of size 4
==100706==    at 0x11B5A2: HuffmanTree::build_tree(std::istreambuf_iterator<char, std::char_traits<char> >) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10CD52: HuffmanArchiver::compress(std::istream&, std::ostream&) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10C519: process_request(unsigned long, char const* const*, CLI&) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10BECD: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==  Address 0x8 is not stack'd, malloc'd or (recently) free'd
==100706== 
==100706== 
==100706== Process terminating with default action of signal 11 (SIGSEGV)
==100706==  Access not within mapped region at address 0x8
==100706==    at 0x11B5A2: HuffmanTree::build_tree(std::istreambuf_iterator<char, std::char_traits<char> >) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10CD52: HuffmanArchiver::compress(std::istream&, std::ostream&) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10C519: process_request(unsigned long, char const* const*, CLI&) (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==    by 0x10BECD: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/hw_03)
==100706==  If you believe this happened as a result of a stack
==100706==  overflow in your program's main thread (unlikely but
==100706==  possible), you can try to increase the size of the
==100706==  main thread stack using the --main-stacksize= flag.
==100706==  The main thread stack size used in this run was 64000000.

Файл из 16 букв 'a':
статистика сжатия:

16
2
8

Статистика разжатия:

3
16
8

Откуда 11й байт?


флаги --file --output ?

Откуда пошло такое странное выранивание doctest макросов? По два дополнительных отступа?


А зачем нужнм main.h? Две структуры в нем должны относится к CLI
Одна относится к архиватору.

private:
    struct cli_request;

    static bool read_flag(cli_request &, std::size_t &, const char *const *&);

read_flag можно сделать статической функцией в CLI.cpp. Без привязки к классу. Аналогично struct CLI::cli_request. Они никак не относятся к интерфейсу класса и из заголовка их можно убрать.


Давайте аргументам имена.

    void out_dfs(std::vector<bool> &, std::string &) const;

    void make_dict(std::vector<bool> &, std::unordered_map<char, std::vector<bool>> &) const;

Вот что это за параметры? А методы публичные.

    } catch (cli_exception &e) {
        std::cout << e.what() << std::endl;
    } catch (std::ios_base::failure &e) {
        std::cout << e.what() << std::endl;
    }

std::ios_base::failure вроде унаследован от std::exception.
И ненулевой код вернуть надо бы.

struct out_bit_iterator final : public std::iterator<std::output_iterator_tag, bool> 

не надо от этого мусора наследоваться.

сделайте using нужных тегов и типов и все.


Надо потестить значения кодов для разных символов (у вас только длины проверяются)

Для I/O оберток и парсера аргументов тоже нужны тесты.


6 + 5 + 5 + 7.5

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

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

comment:3 Changed 4 years ago by Roman Venediktov

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

1 Мне тоже везде стоило принимать итераторы по темплейтам?

2 Если считать, что это MVC для бедных, то main -- controller и он, казалось бы, должен держать у себя объявления всего, что нужно для взамодействия с ним.

3 Теперь большинство методов не публичные.

4 Зачем тестить именно код символа? Если я когда-нибудь поменяю, в какую сторону -- 0, в какую -- 1, то тесты перестанут проходиться, но программа же корректно работает...

5 Я не смог понять, как делать using для нужных тэгов...

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

Replying to Roman Venediktov:

1 Мне тоже везде стоило принимать итераторы по темплейтам?

Если хотелось универсального алгоритма, работающего с любым источником данных -- да.

2 Если считать, что это MVC для бедных, то main -- controller и он, казалось бы, должен держать у себя объявления всего, что нужно для взамодействия с ним.

Слишком для бедных.

4 Зачем тестить именно код символа? Если я когда-нибудь поменяю, в какую сторону -- 0, в какую -- 1, то тесты перестанут проходиться, но программа же корректно работает...

Одно из назначений тестов как раз в том, чтоб оперативно увидеть, что вы что-то кардинально поменяли. И либо изменить тесты, либо понять, что вы что-то сломали.

5 Я не смог понять, как делать using для нужных тэгов...

class MyIterator {
public:
   using iterator_category = std::forward_iterator_tag;
   using value_type = int;
   ....
}

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

Resolution: задача сдана
Status: assignedclosed
==277589== 40 bytes in 1 blocks are definitely lost in loss record 1 of 4
==277589==    at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==277589==    by 0x143B08: _DOCTEST_ANON_FUNC_7() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x1246CD: doctest::Context::run() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x111022: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589== 
==277589== 40 bytes in 1 blocks are definitely lost in loss record 2 of 4
==277589==    at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==277589==    by 0x143C78: _DOCTEST_ANON_FUNC_7() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x1246CD: doctest::Context::run() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x111022: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589== 
==277589== 48 bytes in 1 blocks are definitely lost in loss record 3 of 4
==277589==    at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==277589==    by 0x143985: _DOCTEST_ANON_FUNC_7() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x1246CD: doctest::Context::run() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x111022: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589== 
==277589== 120 bytes in 3 blocks are definitely lost in loss record 4 of 4
==277589==    at 0x483C583: operator new[](unsigned long) (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so)
==277589==    by 0x142DE8: _DOCTEST_ANON_FUNC_2() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x1246CD: doctest::Context::run() (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589==    by 0x111022: main (in /home/dmis/DATA/WORKSPACE/cpp-labs/hw_03/check/hw_03/test_hw_03)
==277589== 


Статистику выводите потоянно с ошибкой в 1 байт.


count_symbols(std::istreambuf_iterator<char> &input) лучше пару итераторов. И принимать по (неконстантной) ссылке итератор не нужно.

template<typename T>
struct two_queues

ОЧень странное название для класса, ведущего себя как одна очередь с приоритетами.


8.5 + 7.5 + 5 + 7.5

Note: See TracTickets for help on using tickets.