Opened 5 years ago

Closed 5 years ago

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

WW #4

Reported by: Gleb Marin Owned by: Sokolov Viacheslav
Component: WW_mergesort Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 5 years ago by Sokolov Viacheslav

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

В mergesort.c не хватает #include <assert.h>

Makefile: лучше не BIN = obj, а OBJ = obj
не хватает зависимостей .o от .h

В С, С++ можно писать вот так:

 12 const char T_HELP[] = "Welcome to the command-line interface for sorting elements."
 13     " Type 'int', 'char' or 'str' to sort one of this types."
 14     " Then type as much as you want elements. For example:"
 15     "\n    './lab_04 int 3 2 1' (Output: '1 2 3')"
 16     "\n    './lab_04 char c b a' (Output: 'abc')"
 17     "\n    './lab_04 str ab ac' (Output: 'ab ac')\n";

при этом строчки "" склеиваются в одну большую строку, как будто между ними нет пробельных символов. Это удобно использовать для длинных строк.

Больше контрактов! element_size может быть 0? comparator может быть NULL? elements * element_size не должно переполняться, сами компараторы работают с ненулевыми указателями.
Кстати, в компараторах потеряна константность:

26     return strcmp(*(CONST char **)a, *(CONST char **)b);

В С++ так уже нельзя будет делать, да и в С не стоит.

like за именование внутри mergesort, именованные константы и --help.

В mergesort можно упростить реализацию алгоритма, если заменить условие цикла на
!((char *)p_left == (char *)array + left_size * element_size && (char *)p_right == (char *)array + elements * element_size)

сами проверки также можно упростить с помощью сохранения указателя на array + left_size * element_size и сравнения с ним напрямую. От этого выигрыает и читаемость, и производительность.

По условию запрещено использовать memcpy ("Все операции, связанные с копированием памяти, надо реализовать самостоятельно.").

Некоторые касты к char* не нужны, потому что тип и так char*.

Есть еще одно скользкое место: результат вызова malloc(0) не специфирован
https://en.cppreference.com/w/c/memory/malloc
If size is zero, the behavior is implementation defined (null pointer may be returned, or some non-null pointer may be returned that may not be used to access storage, but has to be passed to free).
Проще всего сделать так, чтобы его не было (в main.c)

В остальном программа работает корректно.

comment:2 Changed 5 years ago by Gleb Marin

Version: 1.02.0

comment:3 Changed 5 years ago by Sokolov Viacheslav

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

Все еще

не хватает зависимостей .o от .h

Note: See TracTickets for help on using tickets.