Opened 7 years ago

Closed 7 years ago

Last modified 7 years ago

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

Домашнее задание №2

Reported by: agapova.tatyana Owned by: Vladimir Rutsky
Priority: проверка Milestone:
Component: HA#2 huffman Version:
Keywords: Cc: tatjana.agapova@…

Description

Здравствуйте! Проверьте работу, пожалуйста.

Change History (7)

comment:1 Changed 7 years ago by Vladimir Rutsky

Milestone: ha2-milestone1ha2-milestone2
Type: ожидается проверкаожидаются исправления

Замечания:

  1. У вас все методы класса Huffman статические --- сделайте их свободными функциями, а функции не относящиеся к интерфейсу кодирования/декодирования (например, buildFrequencyTable(), readFrequencyTable(), FrequencyTable) перенесите в cpp файл.
  1. Зачем вы включаете <iostream> в huffman.cpp.
  1. Запись длины выравнивания относится к дополнительной информации: out.put((char)(8 - remainder));. Эта информация не является необходимой --- её можно вычислить имея таблицу встречаемости символов, не записывайте её в архив.
  1. Вы безусловно записываете выравнивающий байт, даже если количество бит сжатого потока кратно байту:
	uint8_t c = 0;
	for (uint32_t i = 0, j = 7; i < remainder; ++i, --j) {
		c = c | ((uint8_t)encodedData[fullBytes * 8 + i] << j);
	}
	out.put((char)c);

Исправьте, пожалуйста, в течение 60 часов.

comment:2 Changed 7 years ago by agapova.tatyana

Type: ожидаются исправленияожидается проверка

Исправлены замечания.

comment:3 Changed 7 years ago by Vladimir Rutsky

Type: ожидается проверкаожидаются исправления

Замечания:

  1. Вы не инициализируете stats.initialSize при декодировании пустого файла, и фактически выводите произвольное число в статистике.

Исправьте, пожалуйста, в ближайшее время.

comment:4 Changed 7 years ago by Vladimir Rutsky

valgrind находит и другие места, где происходит чтение неинициализированной памяти.

***** abababab.1.in ******
==18315== Use of uninitialised value of size 8
==18315==    at 0x403ADA: decode(std::vector<bool, std::allocator<bool> > const&, unsigned int, Node const*, std::vector<char, std::allocator<cha
r> >&) (huffman.cpp:281)
==18315==    by 0x403C28: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:310)
==18315==    by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349)
==18315==    by 0x4024CF: main (main.cpp:106)


***** 00_to_ff.256.in ******
==19481== Invalid read of size 8
==19481==    at 0x403AC6: operator bool (stl_bvector.h:81)
==19481==    by 0x403AC6: operator* (stl_bvector.h:321)
==19481==    by 0x403AC6: operator[] (stl_bvector.h:863)
==19481==    by 0x403AC6: decode(std::vector<bool, std::allocator<bool> > const&, unsigned int, Node const*, std::vector<char, std::allocator<cha
r> >&) (huffman.cpp:281)
==19481==    by 0x403C28: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:310)
==19481==    by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349)
==19481==    by 0x4024CF: main (main.cpp:106)
==19481==  Address 0x5ae31e0 is 0 bytes after a block of size 256 alloc'd
==19481==    at 0x4C2E0EF: operator new(unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==19481==    by 0x40484B: allocate (new_allocator.h:104)
==19481==    by 0x40484B: allocate (alloc_traits.h:491)
==19481==    by 0x40484B: _M_allocate (stl_bvector.h:492)
==19481==    by 0x40484B: std::vector<bool, std::allocator<bool> >::_M_insert_aux(std::_Bit_iterator, bool) (vector.tcc:790)
==19481==    by 0x403A33: push_back (stl_bvector.h:926)
==19481==    by 0x403A33: readBoolVector(std::istream&) (huffman.cpp:270)
==19481==    by 0x403B78: decode(std::istream&, Node const*, CompressionStatistics&, unsigned short) (huffman.cpp:298)
==19481==    by 0x403FE5: decompress(std::istream&, std::ostream&) (huffman.cpp:349)
==19481==    by 0x4024CF: main (main.cpp:106)

Поймите, где может происходить такая ошибка, и исправьте её (я крайне *не рекомендую* пытаться инициализировать всё подряд, т.к. не факт, что вам повезёт и вы угадаете, что вызывает данные ошибки).

comment:5 Changed 7 years ago by agapova.tatyana

Type: ожидаются исправленияожидается проверка

Спасибо за замечания, исправила ошибку работы с памятью.

comment:6 Changed 7 years ago by Vladimir Rutsky

Resolution: задача сдана
Status: newclosed

Решение зачтено.

comment:7 Changed 7 years ago by Vladimir Rutsky

Milestone: ha2-milestone2

Milestone ha2-milestone2 deleted

Note: See TracTickets for help on using tickets.