Opened 5 years ago

Closed 5 years ago

#349 closed ожидаются исправления (задача НЕ сдана)

WW #3

Reported by: pshek.maksim Owned by: Egor Suvorov
Component: WW_intrusive_list Version: 1.0
Keywords: Cc:

Description

Забыл создать тикет...

Change History (1)

comment:1 Changed 5 years ago by Egor Suvorov

Resolution: задача НЕ сдана
Status: assignedclosed
Type: ожидается проверкаожидаются исправления

До дедлайна была посылка 1204. Она, к сожалению, не компилируется (предупреждение компилятора), а если и компилируется, то сразу падает. Это +1 за Makefile и структуру и +1 по стилю за довольно разумную попытку сдачи.

Следующая более корректная попытка — увы, только через 20 минут после дедлайна, 1204.

Корректность:

  1. Утекает память.
  2. print выводит лишний пробел в конце строки.
  3. Если скормить на вход очень длинную команду, то будет UB и Unknown command выведется несколько раз. Как я выяснил: заменил исходный размер буфера со 128 на 4 и попробовал вбить что-то не очень длинное под Valgrind. Причина: передаёте в realloc не *buffer, а buffer.
  4. В clist.h следует включить <stddef.h>, чтобы при подключении clist.h работал макрос container_of, который использует offsetof из стандартной библиотеки.

Баллы за корректность были бы 6/8:

  • Корректный Makefile и структура папок +1
  • Работают print, add, exit (возможно, с утечками или нарушениями формата) +2
  • Работает ещё и len +1
  • Работает ещё и rm +1
  • Работает ещё и rma +1

readLine впечатляет. Примерно так он и реализуется, да.

По стилю 1.5/4:

  1. Непонятно, зачем дописывать единичку ко всем именам переменных: list1, node1. Просто list и node.
  2. Ставьте не больше одной пустой строки подряд.
  3. Отделяйте разные функции пустой строкой.
  4. add_node можно проще: там можно сделать node1->next = ... вне ифа, равно как и list1->head = ....
  5. get_length должен принимать указатель на список, как и все остальные функции. Незачем копировать структуру.
  6. В remove_node поехавшие отступы.
  7. В remove_node можно упростить: элемент первый тогда и только тогда, когда нет предыдущего. Два ифа можно склеить в один.
  8. Используйте сделанные typedef: не struct intrusive_node, а просто intrusive_node.
  9. Объявляйте переменные в самом вложенном месте, где они в первый раз нужны.
  10. Ставьте пробелы вокруг бинарных операторов: x[a + b] = y[c];
  11. Промежуточный буфер CMD не нужен, можно сравнивать просто данные из buf.
  12. #define command(name) — так лучше не стоит, лучше честно везде написать if, будет понятнее. Тут не такая большая экономия в символах и повторах, чтобы использовать макрос.

Итого было бы 7.5/12.

Если хотите ещё дорешать — смело переоткрывайте тикет.

Note: See TracTickets for help on using tickets.