Opened 5 years ago

Closed 4 years ago

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

WW #3

Reported by: egipti.pavel Owned by: egipti.pavel
Component: WW_intrusive_list Version: 2.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 5 years ago by Egor Suvorov

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

Корректность 1/8 (только за Makefile):

  1. В программе всегда происходит undefined behavior: while (strcmp(...)) начинает читать из неинициализированного буфера string.
  2. В add_point выделяется память не того размера: sizeof new возвращает размер указателя.
  3. Лишний вывод на каждый add.
  4. print выводит лишний пробел в конце строки.
  5. Если скормить на вход очень длинную команду, то Unknown command выведется несколько раз.
  6. Есть утечка памяти: удаление головы списка никогда не происходит.
  7. Не работает rm: не в том порядке считываются координаты.

Стиль 1/4:

  1. Вместо while (!strcmp(...)) лучше было бы поставить while (true), а по команде exit делать break;. Сейчас так и делаете, но зачем-то стоит лишнее условие.
  2. Объявляйте переменные в самом вложенном месте, где они в первый раз нужны. Например, x и y.
  3. string --> command.
  4. Незачем выделять struct intrusive_list в куче, можно просто сделать локальную переменную.
  5. Ставьте пробел после запятой: int x, y; вместо int x,y;
  6. Ставьте пробелы вокруг бинарных операторов: x[a + b] = y[c];
  1. Незачем выделять фиктивный элемент при помощи malloc: просто встройте intrusive_node как поле в intrusive_list.
  2. Незачем сохранять строковые константы в массивы: просто !strcmp(s, "rm") работает.
  3. add_node: лучше модифицировать не не list->head->next и list->head->next->prev, а node->prev->next и node->next->prev для симметрии.
  4. Лучше не if (x != NULL), а просто if (x).
  5. remove --> deinit_list для симметрии с init_list. Или хотя бы remove_list.
  6. #include <stdlib.h>", а не #include "stdlib.h", это библиотека не в вашем проекте.
  7. В конструкции &(a->b) скобки не нужны.
  8. В main лучше сделать цепочку else if, а не один раз дублировать все условия в конце.
  9. Лучше не strcmp(a, b) == 0, а !strcmp(a, b). Аналогично с strcmp(a, b) != 0: просто strcmp(a, b).
  10. Не нужна промежуточная переменная size в команде len.

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

comment:2 Changed 4 years ago by egipti.pavel

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

comment:3 Changed 4 years ago by Дмитрий Лапшин (lapshin)

Status: reopenedassigned

comment:4 Changed 4 years ago by Egor Suvorov

Owner: changed from Egor Suvorov to egipti.pavel
Type: ожидается проверкаожидаются исправления

Как обсудили в личке, тут нужен clist.c не из lab_05, а доделанный/переделанный ваш.

По корректности было бы 6/7:

  1. <stddef.h> стоит включать в том же месте, где объявляется container_of. Чтобы можно было включить заголовок и сразу заработало.
  2. Реализация множества точек должна находиться в main.c, clist.c — это список в общем виде.
  3. Если скормить на вход очень длинную команду, то переполнится буфер str, будет UB.
  4. Если скормить на вход очень длинную команду, то Unknown command выведется несколько раз.

Стиль было бы 1/3:

  1. Местами отступы и пробелы поехали (clist.h: строчки 8 и 19 в частности, но и в целом).
  2. В main.c цепочку else if лучше писать без фигурных скобок, чтобы не было диагонального кода:
    if (...) {
        ...
    } else if (...) {
        ...
    } else if (...) {
        ...
    } else {
        ...
    }
    
  3. stroka — название не по делу.
  4. 240 — размер буфера не по делу, можно точнее.
  5. strcmp() == 0 лучше записать как !strcmp
  6. first/second — есть названия получше для координат точек.
  7. Мойте тарелки перед едой — считывайте команду один раз в начале цикла, а не один раз перед циклом и один раз в конце. Чтобы дублирования кода не было. Оно как раз вас укусило в плане корректности: в одном месте размер буфера указан, а в другом — нет.

Итого, если сделаете так же хорошо со своей реализацией, было бы 7/10 в дорешке.

comment:5 Changed 4 years ago by Egor Suvorov

Resolution: задача НЕ сдана
Status: assignedclosed
Note: See TracTickets for help on using tickets.