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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Version: | 1.0 → 2.0 |
---|
Вроде бы все работает, по крайней мере valgrind не ругается и изображения на глаз одинаковые.
Новое вычисление паддинга.
Crop и rotate90 добавлены.
Немного непонятно, как мне увидеть M?
Убрал лишние действия с RGB -> BGR и BGR->RGB
Извиняюсь за массив размером 54.
Debug output убран.
comment:3 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:4 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Немного непонятно, как мне увидеть
^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.
Корректность:
Стиль
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 (т.к. код еще будет дописываться).