Opened 5 years ago

Closed 4 years ago

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

HW #1

Reported by: sukhodolskiy.maksim Owned by: Sokolov Viacheslav
Component: HW #1 (BMP) Version: 2.0
Keywords: Cc:

Description


Change History (8)

comment:1 Changed 4 years ago by Sokolov Viacheslav

Type: ожидается проверкаожидаются исправления
╰─>$ make
mkdir -p obj
gcc src/main.c -Iinclude -Wall -Wextra -Werror -g -O0 -c -o obj/main.o
In file included from src/main.c:1:0:
include/bmp.h:8:9: error: unknown type name ‘uint8_t’
 typedef uint8_t BYTE;
         ^~~~~~~
include/bmp.h:9:9: error: unknown type name ‘uint16_t’
 typedef uint16_t WORD;
         ^~~~~~~~
include/bmp.h:10:9: error: unknown type name ‘uint32_t’
 typedef uint32_t DWORD;
         ^~~~~~~~
Makefile:11: recipe for target 'obj/main.o' failed
make: *** [obj/main.o] Error 1

comment:2 Changed 4 years ago by sukhodolskiy.maksim

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

Почему у меня это работает??

comment:3 Changed 4 years ago by Sokolov Viacheslav

Другая версия компилятора / стандартной библиотеки. В системе могут быть иначе организованы включения заголовочных файлов друг в друга, могут быть определены другие макросы. Проблема усугубляется при использовании сторонних библиотек.

comment:4 Changed 4 years ago by Sokolov Viacheslav

Теперь собирается.

comment:5 Changed 4 years ago by Sokolov Viacheslav

Можно сделать меньше пиковое потребление памяти.

Сейчас не выполняется требование

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

сразу скажу, что использовать в bmp.c exit не стоит, причины опишу на Вики.

13 assert(fread(&input_bmp->file_header, sizeof(char), sizeof(BITMAPFILEHEADER), input_file) == sizeof(BITMAPFILEHEADER));
14 assert(fread(&input_bmp->info_header, sizeof(char), sizeof(BITMAPINFOHEADER), input_file) == sizeof(BITMAPINFOHEADER));
25 assert(fread(input_bmp->pixels[i], sizeof(char), byte_width, input_file) == (size_t)byte_width);

Внутрь assert не стоит как-либо модифицировать что-либо. assert может быть вырезан на этапе компиляции (-DNDEBUG), что приведет к тому, что программа перестанет работать.

40 if (byte_width % 4 != 0) {
41 byte_width = (1 + byte_width / 4) * 4;
42 }

стоит вынести в функцию, дублируется

В rotate нужно пересчитать file_header.bfSize

comment:6 Changed 4 years ago by Sokolov Viacheslav

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

comment:7 Changed 4 years ago by sukhodolskiy.maksim

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

Я постарался максимально использовать short-circuit evaluation.
В crop и rotate, однако, нужно было только один malloc на NULL проверить, поэтому написал просто if.
Также при открытии файлов я сразу проверяю на NULL, чтобы не делать fclose(NULL), я же верно делаю?

comment:8 Changed 4 years ago by Sokolov Viacheslav

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

проверка пользовательского ввода осуществлена не совсем корректно: в месте чтения аргументов не проверяется, что они заданы корректно; вместо этого программа упадет по assert-у. Лучше было бы проверять переданные данные на валидность, выдавать сообщение об ошибке пользователю и на этом сразу прекращать работу.

функция get_padding_width не соответствует своему названию: padding - это размер пропуска. Можно было бы именовать aligned_width

hw_01: src/stego.c:5: encode_char: Assertion `(c >= 'A' && c <= 'Z')
c == ' ' c == '.' c == ', failed.

(\n в конце строки)

7 #define BIT_MASK 7

8 equals 00000111

можно использовать 0b111

10 #define MAX_VAL ALPHABET_SIZE + 2

раскроется в 26 + 2.
И, скажем, MAX_VAL * 2 окажется не 56, а 26 + 2 * 2 = 30.
По этой причине в макросах ставят скобки:

10 #define MAX_VAL (ALPHABET_SIZE + 2)

кодирование / декодирование реализовано неверно - символы не записываются побитово; перепутаны x и y при записи; записанное сообщение не удастся прочитать (тестируйте свой код)

Note: See TracTickets for help on using tickets.