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 Артур Гулецкий (huletski)

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

Моя прога собирается, но не работает.

Да, собирается (+0.01) и не работает:

{lab_04}[2369]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/sarmin.pavel/lab_04
Updating '.':
At revision 1452.
{lab_04}[2370]$ 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 lab4
{lab_04}[2371]$ ./lab4 char a b
a b (null) XDG_VTNR=7

Я не знаю, что делать с вводом.

Нужно в зависимости от типа, переданного через аргумент командной строки, завести массив определенного размера, в которой скопировать остальные аргументы командной строки (элементы массива). В случае с типом "int" нужно дополнительно конвертировать строковое представление в численное (см. функцию atoi).

Прочие замечания:

  • исполняемый файл должне называться lab_04;
  • используйте библиотечную реализацию strcmp;
  • функцию memcpy по условию запрещено использовать, надо написать свою.

comment:2 Changed 5 years ago by sarmin.pavel

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

Файл, который выводится переименовал,
strcmp использовал,
my_memcpy написал.
И спасибо за подсказку с вводом.

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

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 sarmin.pavel

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

Основная проблема пофикшена новым компаратором.

  1. Ну, я заново затабал все. Надеюсь лучше.
  2. Перенес.
  3. Я не понял((
  4. Переделал.

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

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

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

Замечания

include/mergesort.h

  • используется size_t в сигнатуре, а заголовочный файл не подключили.

src/main.c

массивы переменного размера на стеке лучше не создавать (main.c:35), т.к. в общем случае это может приводить к его переполнению (память, выделенная под стек, ограничена). В main это не так критично, но лучше хранить содержимое массивов переменного размера в динамической памяти;

Я не понял((

main.c:35 - содержимое массива хранится на стеке, а не в динамической памяти, как для других типов.

src/mergesort.c

  • не проверяеся успешность выделения памяти malloc'ом (в случае ошибки программа могла бы упасть по assert'у).

--
Итог: 10

Note: See TracTickets for help on using tickets.