Opened 5 years ago
Closed 4 years ago
#338 closed ожидается проверка (задача сдана)
WW_mergesort
Reported by: | an.alina | Owned by: | Артур Гулецкий (huletski) |
---|---|---|---|
Component: | WW_mergesort | Version: | 3.0 |
Keywords: | Cc: |
Description
Change History (9)
comment:1 Changed 5 years ago by
Owner: | changed from <huletski > to Артур Гулецкий (huletski) |
---|---|
Status: | assigned → accepted |
comment:2 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:3 Changed 5 years ago by
Status: | accepted → assigned |
---|
comment:4 Changed 5 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.0 |
comment:5 Changed 5 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Решение совпадает с точностью до имен переменных (и части исправлений) с #391. Ошибки и недочеты те же:
{lab_04}[2171]$ pwd && svn up && svn status && make /home/hfx/dvl/cpp19/an.alina/lab_04 Updating '.': At revision 1629. mkdir obj gcc src/main.c -Iinclude -c -Wall -Wextra -Werror -o obj/main.o gcc src/mergesort.c -Iinclude -c -Wall -Wextra -Werror -o obj/mergesort.o gcc obj/mergesort.o obj/main.o -o lab_04 {lab_04}[2172]$ valgrind ./lab_04 char a a ==5054== Memcheck, a memory error detector ==5054== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al. ==5054== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info ==5054== Command: ./lab_04 char a a ==5054== ==5054== Invalid read of size 1 ==5054== at 0x4C31FB4: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5054== by 0x400A43: char_comp (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400880: mergesort (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400C08: main (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== Address 0x5204091 is 0 bytes after a block of size 1 alloc'd ==5054== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5054== by 0x40079F: mergesort (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400C08: main (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== ==5054== Invalid read of size 1 ==5054== at 0x4C31FB7: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5054== by 0x400A43: char_comp (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400880: mergesort (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400C08: main (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== Address 0x52040e1 is 0 bytes after a block of size 1 alloc'd ==5054== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==5054== by 0x4007B5: mergesort (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== by 0x400C08: main (in /home/hfx/dvl/cpp19/an.alina/lab_04/lab_04) ==5054== a a ==5054== ==5054== HEAP SUMMARY: ==5054== in use at exit: 0 bytes in 0 blocks ==5054== total heap usage: 4 allocs, 4 frees, 1,028 bytes allocated ==5054== ==5054== All heap blocks were freed -- no leaks are possible ==5054== ==5054== For counts of detected and suppressed errors, rerun with: -v ==5054== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 0 from 0)
Как так получилось?
comment:6 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
Коды похожи, потому что я обращалась за помощью в объяснении, а писала сама, честно-честно!
Изменила компаратор, аллокацию памяти для строк, но не получилось её освободить, появляются ошибки.
comment:7 Changed 4 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
Коды похожи, потому что я обращалась за помощью в объяснении, а писала сама, честно-честно!
Ок, верю. Но придется кое-что поменять в реализации mergesort, чтобы получить полный балл. Без доп. изменений максимальное число баллов будет 6.
Замечания:
- про ошибку освобождения памяти вы знаете сами -> -2;
- единый стиль отступов не соблюдается (main.c, mergesort.c) -> -1;
Выделение памяти под строки: используется предположение, что max размер строки 100 символов, что неверно, т.к. если строка больше - программа будет работать некорректно, если меньше - будет выделена лишняя помять. Лучше в этом случает выделять памяти ровно столько, сколько требуется для хранения (strlen(s) + 1
). Более того, содержимое строк вы не копируете, хотя, видимо, пытаетесь в main.c:57
.
Надо заменить, что выделять память под содержимое строк вообще не надо, нужно выделить память под массив строк и инициализировать его элементы элементами argv
.
Доп. задания:
- нужно реализовать сортировку так, чтобы был один вызов
malloc
для каждого вызова функцииmergesort
. Не забывайте проверять, что память выделилась успешно. Если нет, программа может аварийно завершитсяassert
(+2); - перепишите
mergesort
так, чтобы использовался один циклwhile
(сейчас их три) (+2).
Итог: 3/10, доделывайте.
comment:8 Changed 4 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
Отступы исправила, память под строки нормально выделила, malloc теперь один, цикл while тоже.
comment:9 Changed 4 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Не собирается решение (вероятно, случайно обновили файл, будьте внимательнее):
{lab_04}[2055]$ pwd && svn up && svn status /home/hfx/dvl/cpp19/an.alina/lab_04 Updating '.': At revision 1795. {lab_04}[2056]$ make mkdir obj make: *** No rule to make target 'src/clist.c', needed by 'obj/clist.o'. Stop.
Отступы исправила
Нет:
{lab_04}[2106]$ cat src/main.c ... int main(int argc, char* argv[]) { if (!strcmp("int", argv[1])) { int* array; array = malloc((argc - 2) * sizeof(int)); assert(array); for (int i = 0; i < argc - 2; i++){ array[i] = atoi(argv[i + 2]); mergesort(array, argc - 2, sizeof array[0], int_gt_comparator); } for (int i = 0; i < argc - 2; i++) printf("%i ", array[i]); printf("\n"); free(array); } ...
Примечательно, что сортировка из задания на int/char не работает из-за того, что в цикле чтения зачем-то сортируете весь массив. Возможно, код с правильно расставленными отступами визуально помог бы заменить ошибку -> -1 (за отступы) -1 (за отсутствие тестирования на базовых примерах перед сдачей) -2 (за корректность).
память под строки нормально выделила
Не совсем. char** array = malloc((argc - 1) * sizeof(char**));
- размер элемента массива не sizeof(char**)
, а sizeof(char*)
. Можно было бы написать sizeof(*array)
и не думать о количестве *
.
malloc теперь один
+2
цикл while тоже.
Не совсем то, что ожидалось, но раз формально сделали -> +2.
Итог: 6.
Решение не собирается: