Opened 4 years ago

Closed 4 years ago

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

HW #1

Reported by: sarmin.pavel Owned by: Артур Гулецкий (huletski)
Component: HW #1 (BMP) Version: 2.0
Keywords: Cc:

Description

Моя программа считывает, сохраняет, но не делает crop. А еще rotate работает криво, но работает (поворачивает на 180*).

Change History (4)

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

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

Корректность:

  • сгенерированные файлы похожи визуально, но цвета/четкость изображения изменяется;
  • valgrind находит ошибки работы с памятью;
  • crop не сделан, rotate90 не сделан.

Стиль

include/bmp.h

5: struct BMP описывает внутреннее представление информации об изображении в программе, выравнивание отключать не обязательно;
5: снова лишний ^M в конце каждой строки.

src/main.c

10: лучше проверку напишите на соответствие количества аргументов ожидаемому;

src/bmp.c

10: стиль отступов не совпадает со стилем в других файлах (2 таба vs 1 таб);
11: объявляйте переменную внутри блока инициализации for (строка 28);
14: что значит 54?
14: нет проверок того, что данные считались без ошибок;
15: лучше задать явные определения структур без выравнивания, описывающих заголовки bmp, считать данные в них (в переменные типа заголовок (bmp и dib)), обращаться к полям заголовка по имени, а не по смещению в сырых данных;
16: debug output, нужно убрать в финальной версии решения;
19: представление отрицательных чисел в доп. коде не гарантируется стандартом -> нельзя полагаться на определенное битовое представление -4 (portability issue);
19: в dib заголовке есть поле, которое хранит информацию о размере изображения;
21: надо проверять успешность выделения памяти;
33: чем BGR не угодил?
39: жду с нетерпением;
41: padding не надо учитывать? бтв код флипает не только пиксели но, а цветовые каналы внутри каждого пикселя;

Баллы: корректность 2 (что-то работает), стиль 2 (т.к. код еще будет дописываться).

comment:2 Changed 4 years ago by sarmin.pavel

Version: 1.02.0

Вроде бы все работает, по крайней мере valgrind не ругается и изображения на глаз одинаковые.
Новое вычисление паддинга.
Crop и rotate90 добавлены.
Немного непонятно, как мне увидеть M?
Убрал лишние действия с RGB -> BGR и BGR->RGB
Извиняюсь за массив размером 54.
Debug output убран.

comment:3 Changed 4 years ago by sarmin.pavel

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

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

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

Немного непонятно, как мне увидеть ^M?

Открыть файла под линуксом в редакторе, который отображает пробельные символы, и удалить вручную, либо написать скрипт, который удалит эти символы автоматически.

Корректность

  • неверно обновляется размер файла в заголовке файла;
  • не обновляется размер изображения в заголовке файла;
  • valgrind находит ошибки при работе с памятью;
{hw_01}[2076]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/sarmin.pavel/hw_01
Updating '.':
At revision 2203.
{hw_01}[2077]$ make
mkdir obj
gcc src/bmp.c -Wall -Werror -Wextra -Iinclude -c -o obj/bmp.o
gcc src/main.c -Wall -Werror -Wextra -Iinclude -c -o obj/main.o
gcc obj/bmp.o obj/main.o -o hw_01
{hw_01}[2078]$ valgrind ./hw_01 crop-rotate samples/lena_512.bmp lena.bmp 0 0 512 512
==9505== Memcheck, a memory error detector
==9505== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==9505== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==9505== Command: ./hw_01 crop-rotate samples/lena_512.bmp lena.bmp 0 0 512 512
==9505== 
==9505== Invalid read of size 2
==9505==    at 0x4C32720: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x400B72: crop (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x401093: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==  Address 0x52c52f0 is 0 bytes after a block of size 786,432 alloc'd
==9505==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x40096B: load_bmp (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x400F9C: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505== 
==9505== Invalid read of size 1
==9505==    at 0x4C32758: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x400B72: crop (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x401093: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==  Address 0x52c52f2 is 2 bytes after a block of size 786,432 alloc'd
==9505==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x40096B: load_bmp (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x400F9C: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505== 
==9505== Invalid read of size 1
==9505==    at 0x4C32691: memcpy@@GLIBC_2.14 (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x400B72: crop (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x401093: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==  Address 0x52c52f3 is 3 bytes after a block of size 786,432 alloc'd
==9505==    at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9505==    by 0x40096B: load_bmp (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505==    by 0x400F9C: main (in /home/hfx/dvl/cpp19/sarmin.pavel/hw_01/hw_01)
==9505== 
==9505== 
==9505== HEAP SUMMARY:
==9505==     in use at exit: 0 bytes in 0 blocks
==9505==   total heap usage: 7 allocs, 7 frees, 2,368,592 bytes allocated
==9505== 
==9505== All heap blocks were freed -- no leaks are possible
==9505== 
==9505== For counts of detected and suppressed errors, rerun with: -v
==9505== ERROR SUMMARY: 59 errors from 3 contexts (suppressed: 0 from 0)

Стиль

include/bmp.h

1: отсутствует include guard.

src/main.c

10-13: проверка лучше - assert(argc == 8)

src/bmp.c

13: 54 - лучше было бы определить структуры с описанием полей BMP файла, инициализировать их из файла и работать с их полями;
13: не проверяется успешность чтения из файла;
17, 88: дублирование кода, нужно было вынести в отдельную функцию;
24: отсутствует проверка успешности malloc;
30: тип индекса лучше сделать size_t;
32: не проверяется успешность выполнения fseek;
95: не проверяется успешность выполнения fwrite.

Баллы: корректность 14, стиль 4.5.

Note: See TracTickets for help on using tickets.