#232 closed ожидается проверка (задача сдана)
WW #3
Reported by: | subbotina.olesya | Owned by: | Egor Suvorov |
---|---|---|---|
Component: | WW_intrusive_list | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (10)
comment:1 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
comment:2 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | → 2.0 |
comment:3 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность — 7/8:
print
выводит лишний пробел в конце строки.- Если скормить на вход очень длинную команду, то переполнится буфер
str
, будет UB.
В остальном по корректности отлично.
Стиль — 2.5/4:
- Разные отступы в main.
- Объявляйте переменные в самом вложенном месте, где они в первый раз нужны. Например,
x1
иy1
лучше объявить в каждой из двух ветокif
. А ещё лучше назвать их простоx
иy
. - Аналогично,
struct point *del
лучше объявлять внутри каждого из циклов. А ещё лучше назвать егоpoint
илиpt
. out
для итерации по списку —item
/entry
/point_node
.str
-->command
.printf("%s", "foo");
лучше заменить наprintf("foo");
size_of_l
-->size
, потому что это и так поле списка, и так понятно, что это размер именно списка. А называться он может неl
, а по-другому.l->size
лучше, чемl->size_of_l
.a->size
точно лучше, чемa->size_of_l
.- Глобальная переменная
len
не используется. - В
add_node
лучше сначала выставлять свойстваnode
, а потом все остальные. Тогда код будет чуть красивее и симметричнее, имхо. remove_node
весьма хорош, но можно ещё упростить. Подсказка: вам нужно несколько строк внеif
и дваif
с веткамиelse
: один с условиемnode->prev != NULL
, один с условиемnode->next != NULL
.
Последние два пункта (исправления в списке) стоят +1 балл по стилю.
comment:4 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
Version: | 2.0 → 3.0 |
comment:5 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
Корректность почти:
remove_all_points
зачем-то лезет внутрь списка и руками его меняет. Запрещено заданием так делать изmain.c
. И тут не требуется.- Не выводите пробел после
Unknown command
.
По стилю:
<stddef.h>
стоит включать в том же месте, где объявляетсяcontainer_of
. Чтобы можно было включить заголовок и сразу заработало.- Лучше не
if (x != NULL)
, а простоif (x)
. - В
show_all_points
прекрасно подойдёт циклfor
вместоwhile
. - Что-то не так с отступами в
main
- Можно упростить код
show_all_points
, если под иф убрать вывод пробела, а не всё сразу. - Цикл в
while
(wrong_comm
) можно заменить наscanf("%*[^\n]");
— прочитай символы, не равные \n, и никуда их не записывай. - Из
add_node
без потери корректности можно (и нужно!) выкинуть один из двухif
'ов. Он там вообще ничего не делает.
comment:6 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:7 Changed 5 years ago by
Owner: | changed from Egor Suvorov to subbotina.olesya |
---|---|
Type: | ожидается проверка → ожидаются исправления |
По корректности:
- Не выводите пробел после длины.
По стилю:
- Включайте
<stddef.h>
внутри include guards. Они всегда обрамляют собой весь заголовок. - Сейчас у вас буфер
command
размера 8, аscanf
просите считать строчку длины не больше 6. Плюс один заключающий ноль — получается семь. Поставьте размер буфера впритык.
comment:8 Changed 5 years ago by
Owner: | changed from subbotina.olesya to Egor Suvorov |
---|---|
Type: | ожидаются исправления → ожидается проверка |
comment:9 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Успех, 12/12!
По стилю одно замечание стоит ещё поправить:
#include <stddef.h>
лучше делать до#define container_of
, а его лучше отделять от остальных блоков в заголовке пустой строкой (сейчас он склеился с include guard и его трудно заметить).
comment:10 Changed 5 years ago by
Прошу прощения, забыл про то, что дедлайн уже был, было бы 12/12, но исправления были сделаны только утром в 10:38 :(
Так что остаётся версия 1042, а в ней баллы такие:
- Корректность: 7.5/8 (+0.5 даётся за точное следование формату)
- Стиль: 3.5/4.
Note: See
TracTickets for help on using
tickets.
Идея и структурки норм, осталось додебажить на примере:
rm
, потому что что-то не то происходит (sanitizer/valgrind должны помочь).Подсказки:
add_node
. Случаи "список пустой" и "список непустой" отличаются только одной строчкой.remove_node
разбирайте не 2*2=4 случая с 2*2*=8 тонкостями, а сначала два случая проnode->prev
отдельно с одной тонкостью в каждом, а потом независимо от этого — два проnode->head
с одной тонкостью в каждом. Итого 2*1+2*1=4 тонкости, в два раза меньше думать. У вас сейчас вremove_node
очень много случаев не разобрано, но и не надо — лучше по-другому организовать ифы.check_list
, которая пробегается по списку и проверяет, что все ссылки стоят правильно.remove_point
может легко зациклиться.Пока баллы не ставлю в надежде, что поправите реализацию.