Opened 5 years ago
Closed 4 years ago
#441 closed ожидается проверка (задача сдана)
WW#5
Reported by: | berbat.georgiy | Owned by: | Артур Гулецкий (huletski) |
---|---|---|---|
Component: | WW_c_io | Version: | 2.0 |
Keywords: | Cc: |
Description
Очень-очень-очень сырая версия. Но хотя бы что-то. Промежуточный дедлайн же сегодня?
Change History (3)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Спасибо большое за советы, верное понимание apply() и её аргументов сильно упростило задачу.
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Некорректная работа программы на большинстве тестов; есть ошибки при работе с памятью, например:
{lab_05}[2014]$ pwd && svn up && svn status /home/hfx/dvl/cpp19/berbat.georgiy/lab_05 Updating '.': At revision 1794. ? in.txt {lab_05}[2015]$ cat in.txt 1 2 4 3 5 5 {lab_05}[2016]$ make mkdir obj gcc -c src/clist.c -Iinclude -Wall -Wextra -Werror -o obj/clist.o gcc -c src/point_list.c -Iinclude -Wall -Wextra -Werror -o obj/point_list.o gcc -c -Iinclude -Wall -Wextra -Werror src/main.c -o obj/main.o gcc obj/clist.o obj/point_list.o obj/main.o -o lab_05 {lab_05}[2017]$ valgrind ./lab_05 loadtext in.txt savetext out.txt ==4214== Memcheck, a memory error detector ==4214== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==4214== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==4214== Command: ./lab_05 loadtext in.txt savetext out.txt ==4214== ==4214== ==4214== HEAP SUMMARY: ==4214== in use at exit: 72 bytes in 3 blocks ==4214== total heap usage: 7 allocs, 4 frees, 9,368 bytes allocated ==4214== ==4214== LEAK SUMMARY: ==4214== definitely lost: 24 bytes in 1 blocks ==4214== indirectly lost: 48 bytes in 2 blocks ==4214== possibly lost: 0 bytes in 0 blocks ==4214== still reachable: 0 bytes in 0 blocks ==4214== suppressed: 0 bytes in 0 blocks ==4214== Rerun with --leak-check=full to see details of leaked memory ==4214== ==4214== For counts of detected and suppressed errors, rerun with: -v ==4214== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Замечания по корректности:
- ошибки при работе с памятью: не освобождаете память, выделенную для хранения точек -> -1; считывание бинарного файла (пояснение см. ниже) -> -2;
- вывод текстового файла: неверный формат (
point_list.c:92
), по условию должен быть"%d %d\n"
-> -1; - неверно реализована функция чтения бинарного файла: читается лишняя точка (почему полагаться исключительно на
feof
нельзя рассказывалось на практике) -> -1. Ad-hoc fix:// main.c:32 int read_bytes_nm = fread(x, 1, 1, in_f); if (read_bytes_nm != 1) { break; }
- неверно реализована функция сохранения в бинарный файл: вызов функции
fwrite(get_x_ad, 3, 1, where_to_save);
сохраняет первые три байта кода функцииget_x_ad
, а не значение координаты точки. Fix:fwrite(get_x_ad(node), 3, 1, where_to_save);
-> -1.
Считывание бинарного файла:
main.c:27
: выделяется один байт неинициализированной (содержит случайные данные) динамической памяти, на которую будет ссылаться указатель на int (btw sizeof(int) != 1);main.c:32
: чтение из файла одного байта -> первый байт области памяти, на кот. ссылается указатель становится инициализированным;main.c:33
: копирование _sizeof(int)_ байтов вxxx
, тогда как инициализирован только младший -> вxxx
лежит мусор в старших байтах.- Последующие строки инициализируют второй и третий байт -> четвертый байт значения координаты содержит случайные данные.
Ad-hoc fix: в main.c:27
объявить указатель на char, a не на int.
Fix: читать сразу по три байта int x; read(&x, 3, 1, in_f);
Некоторые замечания по стилю:
- нарушен единый стиль отступов (main.c, clist.c) -> -1;
- функции сохранения, печати и прочие, передаваемые в
apply
, лучше было бы реализовать вmain.c
, т.к. они специфичны для кода-пользователя списка.
За то, что, похоже, писали сами и разобрались с apply более-менее +1.
Итог: 4.
Note: See
TracTickets for help on using
tickets.
Скорее финальный. Дедлайн был продлен до 10.10 23:59.
Решение не собирается:
Пару комментариев по коду:
counter
не должен быть глобальной переменной, используйте аргументdata
(см. след. пункт);data
(илиp2
как у вас) нужен для того, чтобы была возможность как-то передавать аргументы функцииapply
и сохранять произвольное промежуточное состояние между вызовами функции-callback'a на элементах списка. Как аргумент будет использоваться, зависит от логики функции-callback'a;fprintf
и ходить на практики/лекции;fscanf
, чтобы не парсить числа вручную.--
Итог: 0, время сделать хотя бы часть задания еще есть.