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
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 5 years ago by
Version: | 1.0 → 2.0 |
---|
comment:3 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Все еще
не хватает зависимостей .o от .h
Note: See
TracTickets for help on using
tickets.
В mergesort.c не хватает
#include <assert.h>
Makefile: лучше не BIN = obj, а OBJ = obj
не хватает зависимостей .o от .h
В С, С++ можно писать вот так:
при этом строчки "" склеиваются в одну большую строку, как будто между ними нет пробельных символов. Это удобно использовать для длинных строк.
Больше контрактов! element_size может быть 0? comparator может быть NULL? elements * element_size не должно переполняться, сами компараторы работают с ненулевыми указателями.
Кстати, в компараторах потеряна константность:
В С++ так уже нельзя будет делать, да и в С не стоит.
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)
В остальном программа работает корректно.