Opened 5 years ago
Closed 4 years ago
#404 closed ожидается проверка (задача сдана)
WW #5
Reported by: | Alexander Morozov | Owned by: | Sokolov Viacheslav |
---|---|---|---|
Component: | WW_c_io | Version: | 2.0 |
Keywords: | Cc: |
Description
Change History (3)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Вроде все исправил, но хочу заметить, что в задании написано: "вывести все точки на экран, использовать printf-строчку <fmt> для вывода. Должно встречаться ровно два спецификатора: первый %d соответствует x-координате, второй — y-координате; Разделители, не указанные в <fmt>, добавляться не должны (например, пробелы). После вывода ваша программа должна вывести перевод строки.", то есть реализация вроде бы была корректна, потому что %2d не бывает.
comment:3 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Да, в рамках этого задания, наверное, корректная, но его можно было бы сформулировать иначе (по факту важно только количество аргументов и их типы).
В финальной версии остались глобальные состония:
- in_file, out_file
- 67 static unsigned char buffer[NUM_BYTES + 1];
выгоды от этого мало, потенциальных проблем много
Бонус не работает из-за неправильного ассерта (тестировать надо!)
30 assert(0 <= result && result < MAX_NUM);
В данном задании exit - ОК, но вообще его лучше избегать.
23 int ans = 0;
лучше именовать не answer, а result, потому что у функции - возвращаемое значение (return value, результат работы)
not null проверки в from_bytes, to_bytes
здесь static лучше не использовать, потому что в многопоточной среде это повлияет на корректность (функцию можно будет звать только из одного потока), а экономия несущественная
printer_fmt реализован некорректно. Не нужно вручную разбирать форматную строчку, нужно просто передать ее в printf вместе с двумя аргументами. Если форматная строка выглядит как-то так "%2d %2d", работать будет неправильно.
Вообще глобальных состояний лучше избегать. Вот какая-то статья на эту тему https://habr.com/ru/company/mailru/blog/454946/ (быстро не смог найти ничего лучше), она вызывает некоторые вопросы, но кажется, что верхнеуровнево по делу написано
какая мотивация аллоцировать на куче?
Нужно поправить на допбалл:
fprintf / fwrite / fputc может не получиться, если на файловой системе место кончилось.
Нужно как-нибудь специфицировать поведение программы в таком случае - как минимум сообщать об этом с помощью кода возврата. Для этого стоит либо поменять сигнатуру apply (протащить возможность рапортовать ошибку), либо использовать exit. Кроме того, стоит решить, что делать с частично записанными данными - либо оставить, как есть, либо удалить файл целиком, либо оставить только успешно записанные точки, но в любом случае поведение должно быть донесено до конечного пользователя утилиты либо комментарием в main, либо с помощью --help.
Запуск на тестовом примере