Opened 3 years ago

Closed 3 years ago

#63 closed ожидается проверка (задача сдана)

WW_mergesort Mittcev lab_03

Reported by: mitcev.nikita Owned by: Антон Филатов
Component: WW_mergesort Version: 3.0
Keywords: Cc:

Description

Это было жестко и у меня возник миллион вопросов по указателям в процессе, например "Почему важно делать assert, если программа и так и так упадет и каких дополнительных ресурсов это стоит", чем отличается с практической точки зрение объявление char* a = malloc(my_size) или char a[my_size], на чем можно и нужно оптимизировать при копировании. Если sizeof() - это функция времени компиляции, а объявление в квадратных скобках предполагает заранее известный размер массива, то почему gcc позволяет задать в квадратных скобках размер из неизвестной до рантайма переменной, так потом еще и sizeof этого массива спокойно находит.

Я могу либо к практике записывать все, на что не смог сам ответить, либо посоветуйте, пожалуйста, где ответы на такие вопросы искать, потому что в гугле обычно ответы на вопросы "Как сделать, чтобы запускалось", а не "Как сделать лучше"

Change History (5)

comment:1 Changed 3 years ago by Антон Филатов

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

Это очень хорошие и правильные вопросы - их лучше задавать на практике, чтобы ваши товарищи, которые рано или поздно дойдут до этих вопросов, услышали ответ на них сразу.
Если вам нужен срочный ответ и нет возможности дождаться пары - пишите мне (можно в слаке, в вк, по почте) - я отвечу оперативно. Кстати, полезно ещё пообсуждать это с одногруппниками. Именно подискутировать, погуглить вместе.

Я думаю, что нет одного какого-то места, где собраны подобные мысли в одном месте, разве что кроме стандарта языка с. Знание подобных фишек - это и есть профессионализм, и нарабатывание этого знания - это долгий и кропотливый процесс.

Давайте коротко по вашим вопросам пройдём. Если будет нужно, я повторю на практике и расскажу с примерами

Почему важно делать assert - потому что ассерту можно передать не просто assert(bool_var), а assert(bool_var && "Проверка на истинность bool_var") и теперь программа упала не с молчаливым segfault, а вывела на экран assertation_failed(false && "Проверка на истинность bool_var")
Дополнительных ресурсов это стоит ровно настолько, насколько дорого вызвать одну функцию.

Отличие char* a = malloc(my_size) или char a[my_size] только в типе памяти, которые переменная занимает: на стеке или в куче. Удалится ли оно само по выходе из пространства имён или не удалится и им можно будет пользоваться дальше.

Если sizeof() - это функция времени компиляции, а объявление в квадратных скобках предполагает заранее известный размер массива, то почему gcc позволяет задать в квадратных скобках размер из неизвестной до рантайма переменной, так потом еще и sizeof этого массива спокойно находит.

А вот тут коротко не получится. Совсем коротко - всё происходит в компайл тайме, кроме того, что происходит в рантайме :)
вот ещё короткий ответ из стэк оверфлоу
sizeof is always computed at compile time in C89. Since C99 and variable length arrays, it is computed at run time when a variable length array is part of the expression in the sizeof operand.

Но вообще этот вопрос требует чтения стандарта, экспериментов и дебага по стандартным функциям

Теперь по вашей лабе.
Ваша программа выводит на экран всё правильно (ну, может кроме \n в конце - где-то его нет, где-то есть), но при этом в каждом тесте ругается валгринд на утечки памяти. По формальным правилам это 0/7 за корректность
Стиль:

  • в файле mergesort.h не должно быть объявлено никакой функции, кроме mergesort. Если вам нужны доп функции - объявляйте их сразу в mergesort.c - и пользуйтесь ими только внутри этого файла
  • можно пользоваться стандартными функциями strlen, strcpy и тд
  • строчку на 130 символов хорошо бы разбить на несколько: вместо
if (right == elements || (left < mid && comparator((array + left * element_size), (array + right * element_size)) < 0)) {

лучше

if ((right == elements) || 
    (left < mid && comparator((array + left * element_size),
    (array + right * element_size)) < 0)) {

2/3 за стиль.
Итого
2/10

comment:2 Changed 3 years ago by mitcev.nikita

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

Исправил.
Неужели утечка это настолько плохо, чтобы за нее ставить 0 баллов, тем более, что про это не написано в задании к лабе.

comment:3 Changed 3 years ago by Антон Филатов

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

Утечка сама по себе - это плохо. 0 баллов - так получилось по формальный соображениям, поскольку каждый автотест не прошёл, так как в каждом из них была обнаружена проблема.

Сейчас валгринд ругается только на тесты со строками. Вот пример вывода валгринда

==1262== Memcheck, a memory error detector
==1262== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==1262== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==1262== Command: ../../../../cpp20/cpp20/mitcev.nikita/lab_03/lab_03 str foo bar bazooka baz
==1262== Parent PID: 1261
==1262==
==1262== error calling PR_SET_PTRACER, vgdb might block
==1262== Invalid write of size 1
==1262==    at 0x4C32E0D: strcpy (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x108C8E: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==  Address 0x522d0a3 is 0 bytes after a block of size 3 alloc'd
==1262==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x108C4E: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==
==1262== Invalid read of size 1
==1262==    at 0x108924: str_gt_comparator (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108ED3: mergesort (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108E37: mergesort (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108CC2: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==  Address 0x522d193 is 0 bytes after a block of size 3 alloc'd
==1262==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x108C4E: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==
==1262== Invalid read of size 1
==1262==    at 0x108939: str_gt_comparator (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108ED3: mergesort (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108E37: mergesort (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==    by 0x108CC2: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==  Address 0x522d193 is 0 bytes after a block of size 3 alloc'd
==1262==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x108C4E: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==
==1262== Invalid read of size 1
==1262==    at 0x4C32D04: strlen (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x4E994D2: vfprintf (vfprintf.c:1643)
==1262==    by 0x4EA0F25: printf (printf.c:33)
==1262==    by 0x108CF6: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==  Address 0x522d0f3 is 0 bytes after a block of size 3 alloc'd
==1262==    at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==1262==    by 0x108C4E: main (in /home/wwu/cpp20/cpp20/mitcev.nikita/lab_03/lab_03)
==1262==
==1262==
==1262== HEAP SUMMARY:
==1262==     in use at exit: 0 bytes in 0 blocks
==1262==   total heap usage: 9 allocs, 9 frees, 624 bytes allocated
==1262==
==1262== All heap blocks were freed -- no leaks are possible
==1262==
==1262== For counts of detected and suppressed errors, rerun with: -v
==1262== ERROR SUMMARY: 10 errors from 4 contexts (suppressed: 0 from 0)

Подумайте, сколько на самом деле нужно строке место выделить, а сколько выделяете вы

Корректность: 5/7
Стиль: 3/3

8/10

Last edited 3 years ago by Антон Филатов (previous) (diff)

comment:4 Changed 3 years ago by mitcev.nikita

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

comment:5 Changed 3 years ago by Антон Филатов

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

Принимается. 10/10

Note: See TracTickets for help on using tickets.