Change History (3)

comment:1 Changed 5 years ago by Артур Гулецкий (huletski)

Type: ожидается проверкаожидаются исправления

Решение собирается (+0.01), но зависает при попытке запуска на данных из условия:

{lab_04}[2073]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/shelukhina.ekaterina/lab_04
Updating '.':
At revision 1246.
{lab_04}[2074]$ make
mkdir obj
gcc -c -Wall -Wall -Wextra -Werror -Iinclude   src/main.c -o obj/main.o
gcc -c -Wall -Wall -Wextra -Werror -Iinclude  src/mergesort.c -o obj/mergesort.o
gcc obj/main.o obj/mergesort.o -o lab_04
{lab_04}[2075]$ date
Пт окт 11 19:15:33 MSK 2019
{lab_04}[2076]$ ./lab_04 -1 0 2 0 3
^C
{lab_04}[2077]$ date
Пт окт 11 19:16:50 MSK 2019

Замечания после просмотра кода по диагонали:

  • не используйте VLA при реализации сортировки;
  • чините отступы.

comment:2 Changed 5 years ago by Шелухина Екатерина

Type: ожидаются исправленияожидается проверка
Version: 1.02.0

comment:3 Changed 5 years ago by Артур Гулецкий (huletski)

Resolution: задача сдана
Status: assignedclosed

Тесты проходят -> +10.

Комментарии по коду

include/mergesort.h

  • включение заголовочных файлов перед include guard'ом: технически ошибки в этом нет (препроцессор потратит на обработку исходников чуть больше времени), но принято включать файлы _внутри_ guard'a;
  • подключение лишних заголовочных файлов (нужен только stddef.h) -> потенциально немного увеличивается время компиляции;
  • my_memcpy "экспортировать" не нужно, так как по смыслу она является внутренней частью реализации mergesort. Альтернатива - вынести реализацию в отдельный файл (e.g. memory_utils.h).

Если исходников много, то недочеты 1 и 2 могут заметно увеличить время сборки.

src/main.c

  • элементы сортируемого массива хранятся в VLA: не так критично, как было в mergesort, но лучше бы хранились в динамической памяти (т.к. теоретически могут занимать неоправданно много места на стеке).

src/mergesort.c

  • лишние include'ы: string.h, stdio.h;
  • оформление кода: пробельные символы после каждой строки в my_memcpy; отсутствие пустой строки между merge и memcpy, в то время как присутствуют избыточные пустые строки 39 и 40; разный стиль объявления переменных: где-то после базового типа используется один пробел (8), где-то два (14) и т.п.. На это нужно обращать внимание, так как такая "неоднородность" увеличивает время на чтение и понимание кода;
  • merge можно было бы написать одним циклом, выглядело бы компактнее;
  • mergesort использует два вызова функции malloc, можно было бы обойтись одним (один блок, достаточный для хранения обоих "подмассивов", right указывал бы в середину выделенной памяти). Это бы уменьшило нагрузку на менеджер памяти;
  • при выделении памяти отсутствует проверка на то, что память выделилась успешно (в противном случае программа, например, могла бы завершаться с ошибкой, используя assert).

--
Итог: 10. Обратите внимания на замечания, при проверке следующих решений за такие же могут сниматься баллы.

Note: See TracTickets for help on using tickets.