Change History (5)

comment:1 Changed 3 years ago by Святослав Власов

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

Корректность 15/20

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

Стиль -- 3/10

  1. В bmp.h ты используешь типы данных uintXX_t, которые объявлены в stdint.h, но почему-то его не подключаешь
  2. Что за магическая константа 54 в load_bmp? В других местах ты без проблем юзаешь sizeof, что тут пошло не так?
  3. Аналогично с цифрой 3, которая означает размер пикселя. Сделай константу под это либо используй BMP->bitCount.
  4. Можно читать и писать не по одному пикселю, а сразу строку целиком, она же последовательно лежит у тебя в файле.
  5. Если уж ты при нештатных ситуациях решила не падать на assert, а возвращать NULL из функций, то позаботься о том, чтобы у тебя все ресурсы выделенные внутри функции освобождались. У тебя этого не происходит. Или падай на assert.
  6. shift прекрасно можно посчитать формулой, не нужно делать это в цикле.
  7. Код который выделяет память под матрицу нужного размера у тебя из функции в функцию повторяется -- он прям просится в отдельную функцию
  8. Аналогично с освобождением матрицы

comment:2 Changed 3 years ago by Наталья Марцинковская

Type: ожидаются исправленияожидается проверка
Version: 1.02.0
  1. Все еще не получается считывать в одну строчку, не знаю уже, что делать

Остальное исправила

comment:3 Changed 3 years ago by Святослав Власов

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

Корректность 20/20, можешь бонус делать.

Стиль -- 5/10

  1. Зачем тебе функции mem и mem1 в заголовочных файлах? Ты же их не используешь нигде кроме bmp.c. По хорошему их нужно оставить в bmp.c и сделать к тому же статическими. В заголовочном файле должны быть только функции, которые ты используешь в разных файлах. Если функция внутренняя, сугубо "техническая", которая не должна вызываться ниоткуда снаружи, её нужно делать статической, чтобы не торчала во внешней линковке.
  2. Именование. Имена функций и переменных должны быть говорящими, т.е. чтобы по их названию можно было догадаться, для чего они нужны и что делают, даже не смотря в их код. Как по названию mem и mem1 можно догадаться что эти функции делают и, главное, чем отличаются? У тебя эти функции выделяют память под массив, первая просто так, а вторая с выравниванием, то их можно назвать alloc_array и alloc_array_with_padding, если кажется слишком длинно, можно сократить до alloc_arr и alloc_arr_padded. То же самое переменная pixel. Я бы подумал, что это структура данных где хранится пиксель. Но нет, это размер пикселя в байтах. Так назови её pixel_size.
  3. Код, где ты аллоцируешь сначала массив указателей, а потом на каждый указатель -- еще массив, копипастится из функции в функцию, что как бы намекает, что неплохо было бы его перенести в функцию с названием (нет, не mem2) allocate_matrix (или alloc_mat).
  4. Подумай всё таки над тем как читать и писать строку целиком. У тебя ведь не возникло проблемы с тем, чтобы выделить память под строчку нужного размера -- так в чем проблема прочитать в эту память то же количество байт из файла?

comment:4 Changed 3 years ago by Наталья Марцинковская

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

Бонус попыталась сделать, но не получается.
Стиль исправила вроде бы кроме опять 4, потому что там единственный нормальный вариант - записать после каждого третьего байта нули и потом только считывать в строчку, но тогда возникнут проблемы в другом и плюс это будет более громоздко и сложно, чем сейчас.

comment:5 Changed 3 years ago by Святослав Власов

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

29/30

Note: See TracTickets for help on using tickets.