Opened 3 years ago
Closed 3 years ago
#100 closed ожидается проверка (задача сдана)
WW_mergesort Vagif Baratov lab_03
Reported by: | baratov.vagif | Owned by: | Антон Филатов |
---|---|---|---|
Component: | WW_mergesort | Version: | 2.0 |
Keywords: | Cc: |
Description
К сожалению так и не смог наладить аргументы командной строки, поэтому программа не скомпилируется, если есть возможность посмотрите пожалуйста почему аргументы не читаются,если быть точнее второй аргумент, который указывает тип данных, вот он не передается, если вы посмотрите mergesort.c думаю вы поймете про что я и где я вероятнее всего ошибся
Change History (4)
comment:1 Changed 3 years ago by
Type: | ожидается проверка → ожидаются исправления |
---|
comment:2 Changed 3 years ago by
Summary: | WW_mergesort Vagif Baratov lab_3 → WW_mergesort Vagif Baratov lab_03 |
---|---|
Version: | 1.0 → 2.0 |
comment:3 Changed 3 years ago by
Type: | ожидаются исправления → ожидается проверка |
---|
comment:4 Changed 3 years ago by
Resolution: | → задача сдана |
---|---|
Status: | assigned → closed |
Проходят все тесты, кроме одного
тест на char a x z b t z r q падает на валгринде
==2707== error calling PR_SET_PTRACER, vgdb might block ==2707== Invalid read of size 1 ==2707== at 0x4C33DC7: strcmp (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2707== by 0x1087FA: comp_char (in /home/wwu/cpp20/cpp20/baratov.vagif/lab_03/lab_03) ==2707== by 0x108D25: mergesort (in /home/wwu/cpp20/cpp20/baratov.vagif/lab_03/lab_03) ==2707== by 0x108A3E: main (in /home/wwu/cpp20/cpp20/baratov.vagif/lab_03/lab_03) ==2707== Address 0x522d048 is 0 bytes after a block of size 8 alloc'd ==2707== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) ==2707== by 0x1089AA: main (in /home/wwu/cpp20/cpp20/baratov.vagif/lab_03/lab_03) ==2707== ==2707== ==2707== HEAP SUMMARY: ==2707== in use at exit: 0 bytes in 0 blocks ==2707== total heap usage: 9 allocs, 9 frees, 544 bytes allocated ==2707== ==2707== All heap blocks were freed -- no leaks are possible
Коректность: 6,5/7
Стиль:
- потерялся include guard в mergesort.h
- кажется, что от копипасты в main можно избавиться
итого за стиль: 2/3
итого в целом: 8,5/10
Note: See
TracTickets for help on using
tickets.
так, ну давайте разбираться, что у вас с чтением аргументов командной строки
char array[argc];
вы создали массив чаров по количеству аргументов. То есть если будет вызов ./mergesort int 1 21 38, то массив array будет состоять из 5 элементов (потому что argc = 5)
дальше вы создаёте buf и не выделяете под него память - это нормально
потом вы в цикле делаете присваивание
buf = argv[i];
теперь buf, будучи указателем на char указывает на первый char у очередного argv[i], то есть либо на '.', либо на 'i', либо на '1' и так далее
потом вы array[i] (это один char) пытаетесь присвоить значение buf, даже не разыменовывая его. то есть сам по себе buf - это адрес, тогда как *buf - это элемент, хранящийся в памяти по этому адресу
вот такой код
Так, по оставльным вашим ошибкам: в функции mergesort пользоваться argc и argv нельзя - вы же их туда не передали. Сами по себе они передаются только в main
(argv[1])void* left = ... - вот эта запись вообще не понятна. Что вы хотели тут сделать?
*(right + a) = *(array + i); - подобные вещи лучше писать так: right[a] = array[i]
ваш компаратор также написан некорректно
все компараторы, чтобы подставить их правильно в mergesort должны иметь такую сигнатуру:
int comp_int (void* a, void* b)
а уже внутри следует конвертировать void* к int* (именно к int*, а потом разыменовывать указатель. void* к int не приводится)
Пока это 1/10, но вы справитесь, я в вас верю