Opened 5 years ago
Closed 5 years ago
#391 closed ожидается проверка (задача сдана)
WW#4
Reported by: | sarmin.pavel | Owned by: | Артур Гулецкий (huletski) |
---|---|---|---|
Component: | WW_mergesort | Version: | 3.0 |
Keywords: | Cc: |
Description
Моя прога собирается, но не работает. Я не знаю, что делать с вводом.
Change History (5)
comment:1 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
Файл, который выводится переименовал,
strcmp использовал,
my_memcpy написал.
И спасибо за подсказку с вводом.
comment:3 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Почти работает, для запуска под valgrind я убрал санитайзер:
{lab_04}[2066]$ pwd && svn up && svn status /home/hfx/dvl/cpp19/sarmin.pavel/lab_04 Updating '.': At revision 1567. M Makefile {lab_04}[2067]$ svn diff Index: Makefile =================================================================== --- Makefile (revision 1567) +++ Makefile (working copy) @@ -1,15 +1,15 @@ all: lab_04 lab_04: obj obj/mergesort.o obj/main.o - gcc obj/mergesort.o obj/main.o -fsanitize=address -o lab_04 + gcc obj/mergesort.o obj/main.o -o lab_04 obj: mkdir obj obj/mergesort.o: src/mergesort.c include/mergesort.h - gcc src/mergesort.c -Wall -Werror -Wextra -Iinclude -fsanitize=address -c -o obj/mergesort.o + gcc src/mergesort.c -Wall -Werror -Wextra -Iinclude -c -o obj/mergesort.o obj/main.o: src/main.c include/mergesort.h - gcc src/main.c -Wall -Werror -Wextra -Iinclude -fsanitize=address -c -o obj/main.o + gcc src/main.c -Wall -Werror -Wextra -Iinclude -c -o obj/main.o clean: rm -rf obj/ lab_04 {lab_04}[2068]$ make mkdir obj gcc src/mergesort.c -Wall -Werror -Wextra -Iinclude -c -o obj/mergesort.o gcc src/main.c -Wall -Werror -Wextra -Iinclude -c -o obj/main.o gcc obj/mergesort.o obj/main.o -o lab_04 {lab_04}[2069]$ valgrind ./lab_04 char a a ==30650== Memcheck, a memory error detector ==30650== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==30650== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==30650== Command: ./lab_04 char a a ==30650== ==30650== Invalid read of size 1 ==30650== at 0x4C31FB4: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==30650== by 0x400794: char_comp (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x4008EE: mergesort (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x400C08: main (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== Address 0x5204091 is 0 bytes after a block of size 1 alloc'd ==30650== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==30650== by 0x4007F8: mergesort (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x400C08: main (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== ==30650== Invalid read of size 1 ==30650== at 0x4C31FB7: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==30650== by 0x400794: char_comp (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x4008EE: mergesort (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x400C08: main (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== Address 0x52040e1 is 0 bytes after a block of size 1 alloc'd ==30650== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==30650== by 0x40080E: mergesort (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== by 0x400C08: main (in /home/hfx/dvl/cpp19/sarmin.pavel/lab_04/lab_04) ==30650== a a ==30650== ==30650== HEAP SUMMARY: ==30650== in use at exit: 0 bytes in 0 blocks ==30650== total heap usage: 4 allocs, 4 frees, 1,028 bytes allocated ==30650== ==30650== All heap blocks were freed -- no leaks are possible ==30650== ==30650== For counts of detected and suppressed errors, rerun with: -v ==30650== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
За частично пройденные тесты +7.5.
Замечания (без штрафов можно исправлять по желанию):
- не соблюдается единый стиль отступов (e.g.
main.c:24
),^M
(\r) в конце некоторых строк кода (-1); - компараторы нужно перенести в
main.c
, т.к. они не являются частью реализации функции mergesort (-0.5); - массивы переменного размера на стеке лучше не создавать (
main.c:35
), т.к. в общем случае это может приводить к его переполнению (память, выделенная под стек, ограничена). В main это не так критично, но лучше хранить содержимое массивов переменного размера в динамической памяти; - два вызова malloc в mergesort избыточны, хватило бы одного: left указывал бы на начало выделенного блока памяти, right - на элемент, следующий за последним элементом left, в том же блоке; код бы это не усложнило, а нагрузку на менеджер памяти (подсистема, выделяющая динамическую память) уменьшило.
Итог: 6/10, исправляйте.
comment:4 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Основная проблема пофикшена новым компаратором.
- Ну, я заново затабал все. Надеюсь лучше.
- Перенес.
- Я не понял((
- Переделал.
comment:5 Changed 5 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Тесты проходят -> +10.
Замечания
include/mergesort.h
- используется
size_t
в сигнатуре, а заголовочный файл не подключили.
src/main.c
массивы переменного размера на стеке лучше не создавать (main.c:35), т.к. в общем случае это может приводить к его переполнению (память, выделенная под стек, ограничена). В main это не так критично, но лучше хранить содержимое массивов переменного размера в динамической памяти;
Я не понял((
main.c:35
- содержимое массива хранится на стеке, а не в динамической памяти, как для других типов.
src/mergesort.c
- не проверяеся успешность выделения памяти
malloc
'ом (в случае ошибки программа могла бы упасть поassert
'у).
--
Итог: 10
Да, собирается (+0.01) и не работает:
Нужно в зависимости от типа, переданного через аргумент командной строки, завести массив определенного размера, в которой скопировать остальные аргументы командной строки (элементы массива). В случае с типом "int" нужно дополнительно конвертировать строковое представление в численное (см. функцию
atoi
).Прочие замечания:
lab_04
;strcmp
;memcpy
по условию запрещено использовать, надо написать свою.