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: ожидается проверкаожидаются исправления

так, ну давайте разбираться, что у вас с чтением аргументов командной строки
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 - это элемент, хранящийся в памяти по этому адресу

вот такой код

char** array = malloc(argc * sizeof(char*));
char* buf;
for (int i = 2; i < argc; i++) {
	buf = argv[i];
	array[i] = buf;
	printf("%s ", array[i]);
}

позволит прочитать и вывести на экран аргументы командной строки (я настаиваю, чтобы массивы неизвестной до рантайма длины выделялись через malloc)

Так, по оставльным вашим ошибкам: в функции 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, но вы справитесь, я в вас верю

comment:2 Changed 3 years ago by baratov.vagif

Summary: WW_mergesort Vagif Baratov lab_3WW_mergesort Vagif Baratov lab_03
Version: 1.02.0

comment:3 Changed 3 years ago by baratov.vagif

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

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

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

Проходят все тесты, кроме одного
тест на 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.