Opened 5 years ago
Closed 4 years ago
#495 closed ожидается проверка (задача сдана)
HW #1
Reported by: | Solovyev Gleb | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | HW #1 (BMP) | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Последняя версия, загруженная до дедлайна, содержит очень много синтаксических ошибок и неработающий insert-extract. Ну, я сам дурак.
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Оцениваю последнюю версию до дедлайна (r2148)
144 Bitmap *bitmap = malloc(sizeof(Bitmap));
145 assert(bitmap);
Не выполнено требование
При проблемах с аргументами, открытием файла, выделением памяти и прочим, программа должна корректно завершить работу и вернуть ненулевой код возврата.
Глобальных состояний лучше избегать. Вот какая-то статья на эту тему https://habr.com/ru/company/mailru/blog/454946/ (быстро не смог найти ничего лучше), она вызывает некоторые вопросы, но кажется, что верхнеуровнево по делу написано.
Глобальное состояние - это, например, глобальные переменные в main_methods.c
Избежать этого можно было бы, например, объединив нужные поля в структуру и работая с указателем на эту структуру в функциях (тут возникает проблема god object).
Местами комментарии избыточны и не приносят чего-то нового относительно того, что написано в коде.
Кажется, выбран не самый эффективный способ проверить, что символ c является заглавной буквой английского алфавита.
В текстовом файле еще может быть \n\r
Вижу, что стеганография далека от работающей версии
check_bmp_format не такая хорошая идея, как может показаться, потому что на самом деле расширение файла - это условность. Файл может называться как угодно, он не перестает быть от этого записанным в формате bmp (а вот как узнать, что это именно bmp формат - другой вопрос). Точно так же расширение файла .bmp еще не означает, что это именно bmp картинка (может, это вирус).
лучше всегде использовать snprintf - это не будет хуже (менее читаемо / удобно), но безопаснее
В main было бы удобно использовать exit. Я позже напишу на Вики, в каких случаях стоит использовать exit, а в каких это плохая идея. Конкретно для обработки ошибок в функции main в языке Си exit будет удобен.
Альтернативно можно было бы написать макрос, чтобы снизить количество copy-paste кода.
Оба этих подхода направлены на решение проблемы: для простой задачи "если что-то пошло не так - выйти с сообщением об ошибке" в языке Си приходиться писать много "boilerplate" (становится много однообразного кода, его тяжело воспринимать).
Сейчас in закрывается два раза.
Кажется, write_int_to_header реализован неправильно:
Кажется, можно просто
но лучше проверить по Стандарту, что так безопасно делать.
А еще есть _https://stackoverflow.com/questions/3318410/pragma-pack-effect (но не предлагаю переделывать, придется почти все менять)
Не очень понял, зачем нужен get_value_from_header, точнее, зачем там копировать что-то?
в copy_header лучше использовать memcpy (быстрее будет)
158 if (bitmap->data[i] != NULL)
159 free(bitmap->data[i]);
в free безопасно отдавать NULL
(4 - (W * BYTES_IN_PIXEL) % 4) % 4
стоит вынести в функциюСейчас функционал crop-rotate работает