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

Owner: changed from <huletski > to Артур Гулецкий (huletski)
Status: assignedaccepted

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

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

Решение не собирается:

{lab_04}[2356]$ pwd && svn up && svn status
/home/hfx/dvl/cpp19/an.alina/lab_04
Updating '.':
At revision 1452.
{lab_04}[2357]$ make
make: *** No rule to make target 'src/str.c', needed by 'obj/str.o'.  Stop.

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

Status: acceptedassigned

comment:4 Changed 5 years ago by an.alina

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

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

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 an.alina

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

Коды похожи, потому что я обращалась за помощью в объяснении, а писала сама, честно-честно!
Изменила компаратор, аллокацию памяти для строк, но не получилось её освободить, появляются ошибки.

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

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 an.alina

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

Отступы исправила, память под строки нормально выделила, malloc теперь один, цикл while тоже.

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

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

Не собирается решение (вероятно, случайно обновили файл, будьте внимательнее):

{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.

Note: See TracTickets for help on using tickets.