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: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 1.0 → 2.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
comment:4 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|---|
Version: | 2.0 → 3.0 |
comment:5 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Принимается. 10/10
Это очень хорошие и правильные вопросы - их лучше задавать на практике, чтобы ваши товарищи, которые рано или поздно дойдут до этих вопросов, услышали ответ на них сразу.
Если вам нужен срочный ответ и нет возможности дождаться пары - пишите мне (можно в слаке, в вк, по почте) - я отвечу оперативно. Кстати, полезно ещё пообсуждать это с одногруппниками. Именно подискутировать, погуглить вместе.
Я думаю, что нет одного какого-то места, где собраны подобные мысли в одном месте, разве что кроме стандарта языка с. Знание подобных фишек - это и есть профессионализм, и нарабатывание этого знания - это долгий и кропотливый процесс.
Давайте коротко по вашим вопросам пройдём. Если будет нужно, я повторю на практике и расскажу с примерами
Почему важно делать 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 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 за корректность
Стиль:
лучше
2/3 за стиль.
Итого
2/10