Opened 4 years ago

Closed 4 years ago

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

WW #11

Reported by: fomenko.ivan Owned by: Артур Гулецкий (huletski)
Component: WW cpp_io Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 4 years ago by Артур Гулецкий (huletski)

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

Решение не собирается:

{lab_11}[2235]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/fomenko.ivan/lab_11
Updating '.':
At revision 2636.
{lab_11}[2236]$ make
mkdir obj
g++ -std=c++11 -c -Wall -Wextra -Werror -Iinclude src/main.cpp -o obj/main.o
g++ -std=c++11 -c -Wall -Wextra -Werror -Iinclude src/employees.cpp -o obj/employees.o
g++ -std=c++11 -c -Wall -Wextra -Werror -Iinclude src/bin_manip.cpp -o obj/bin_manip.o
src/bin_manip.cpp: In function ‘std::ostream& operator<<(std::ostream&, const write_c_str&)’:
src/bin_manip.cpp:40:21: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
   40 |     while (&b.s[j]!='\0') {
      |                     ^~~~
Makefile:9: recipe for target 'obj/bin_manip.o' failed
make: *** [obj/bin_manip.o] Error 1

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

Некоторые замечания по коду:

  • bin_manip.h:29. Неясно почему имя у второго параметра b;
  • main.cpp:13. Читайте команду в std::string;
  • main.cpp:33. Не хватает проверки успешности открытия потока;
  • bin_manip.cpp:10. Не хватает проверки того, что из потока считался 0 или 1, как требует формат. Если это не так, нужно установить failbit у потока;
  • bin_manip.cpp:18. Чтобы гарантировать little-endian порядок байтов независимо от платформы, значение нужно писать побайтово;
  • bin_manip.cpp:31. Если дочитали до конца файла, а нуль-терминатор не встертили/поток сломался в процессе, нужно выйти из цикла и установить failbit;
  • bin_manip.cpp:41. Для записи данных as is (бинарно) используйте методы неформатированного ввода-вывода (write, read, put);
  • employees.cpp:26. Списки инициализации;
  • employees.cpp:59. this-> избыточен;
  • employees.cpp:64. В массиве нужно сохранять копию аргумента. Как ее сделать обсуждали на паре (метод clone);
  • employees.cpp:89. Строки длиной 100+ символов ухудшают читабельность кода;
  • employees.cpp:132. strncpy;
  • employees.cpp:136. 101? Ограничение на максимальную длину строки лучше вынести в константу;
  • employees.cpp:149. Дублирование кода из main.cpp. Почему это плохо обсудили на практике; значения типов нужно вынести в константы (например, в статическую константу соответствующего класса);
  • employees.cpp:167. Для индексации массива лучше использовать переменную типа std::size_t.

Баллы: 2, доделывайте. Перед посылкой новой версии решения убедитесь, что оно работает на примере из условия.

Last edited 4 years ago by Артур Гулецкий (huletski) (previous) (diff)

comment:2 Changed 4 years ago by fomenko.ivan

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

Честно боролся с клонами, но решил обойти их стороной

comment:3 Changed 4 years ago by Артур Гулецкий (huletski)

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

Проблемы при работе с памятью, программа не работает на примере из условия, другие тесты тоже не проходят -> -2.5:

{lab_11}[2080]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/fomenko.ivan/lab_11
Updating '.':
At revision 2770.
{lab_11}[2081]$ make
mkdir -p obj
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/bin_manip.o src/bin_manip.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/main.o src/main.cpp
g++ -O2 -Wall -Werror -std=c++11 -Iinclude -g -c -MMD -o obj/employees.o src/employees.cpp
g++ obj/bin_manip.o obj/main.o obj/employees.o -o lab_11 
{lab_11}[2082]$ valgrind ./lab_11 
==4899== Memcheck, a memory error detector
==4899== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==4899== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==4899== Command: ./lab_11
==4899== 
add 2 Joe 100 20 300
add 1 Billy 1000 1
list
1. Sales Manager
Name: Joe
Base Salary: 100
Sold items: 20
Item price: 300
2. Developer
Name: Billy
Base Salary: 1000
Has bonus: +
== Total salary: 2160

save example.edb
==4899== Syscall param write(buf) points to uninitialised byte(s)
==4899==    at 0x552C2C0: __write_nocancel (syscall-template.S:84)
==4899==    by 0x4F00C85: ??? (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F3EC4F: std::basic_filebuf<char, std::char_traits<char> >::_M_convert_to_external(char*, long) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F3F0A7: std::basic_filebuf<char, std::char_traits<char> >::overflow(int) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F3EDC1: std::basic_filebuf<char, std::char_traits<char> >::_M_terminate_output() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F420BA: std::basic_filebuf<char, std::char_traits<char> >::close() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F444F4: std::basic_ofstream<char, std::char_traits<char> >::~basic_ofstream() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4014D5: main (main.cpp:34)
==4899==  Address 0x5b1a996 is 38 bytes inside a block of size 8,192 alloc'd
==4899==    at 0x4C2E80F: operator new[](unsigned long) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==4899==    by 0x4F3EB03: std::basic_filebuf<char, std::char_traits<char> >::_M_allocate_internal_buffer() (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F42C62: std::basic_filebuf<char, std::char_traits<char> >::open(char const*, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4F43933: std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::_Ios_Openmode) (in /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.28)
==4899==    by 0x4014C0: main (main.cpp:33)
==4899== 
add 1 Bobby 500 0
load example.edb
list
1. Sales Manager
Name: Joe
Base Salary: 100
Sold items: 20
Item price: 300
2. Developer
Name: Billy
Base Salary: 1000
Has bonus: +
3. Developer
Name: Bobby
Base Salary: 500
Has bonus: -
4. Sales Manager
Name: Joe
Base Salary: 100
Sold items: 20
Item price: 300
5. Developer
Name: Billy
Base Salary: 1000
Has bonus: -
== Total salary: 3820

exit
==4899== 
==4899== HEAP SUMMARY:
==4899==     in use at exit: 73,112 bytes in 11 blocks
==4899==   total heap usage: 21 allocs, 10 frees, 92,768 bytes allocated
==4899== 
==4899== LEAK SUMMARY:
==4899==    definitely lost: 136 bytes in 5 blocks
==4899==    indirectly lost: 272 bytes in 5 blocks
==4899==      possibly lost: 0 bytes in 0 blocks
==4899==    still reachable: 72,704 bytes in 1 blocks
==4899==         suppressed: 0 bytes in 0 blocks
==4899== Rerun with --leak-check=full to see details of leaked memory
==4899== 
==4899== For counts of detected and suppressed errors, rerun with: -v
==4899== Use --track-origins=yes to see where uninitialised values come from
==4899== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)

По коду:

  • employees.h:74. тип должен быть Employee*, про clone вы написали -> -0.5;
  • bin_manip.cpp. манипуляторы чтения/записи int32_t в little-endian реализованы частично, т.к. не гарантируется порядок записи байтов (на big-endian платформе значение будет записано неверно) -> -1;
  • bin_manip.cpp. отсутствует обработка ошибок (установка failbit) в коде считывания данных (bool - если считалось значение отличное от 0 и 1, c-string - если не был найден нуль-терминатор, в этом случае решение вообще зависнет) -> -1;
  • employees.cpp:132. Дублирование кода из main.cpp, почему это плохо обсудили на практике -> -0.75.

+ замечания выше, которые вы решили не исправлять (стиль) -> -0.5

Баллы: 3.75.

Note: See TracTickets for help on using tickets.