Opened 5 years ago

Last modified 4 years ago

#288 assigned ожидаются исправления

WW #4

Reported by: Артём Сон Owned by: Vasily Alferov
Component: WW_mergesort Version: 3.0
Keywords: Cc:

Description

Там пусто.

Change History (4)

comment:1 Changed 5 years ago by Артём Сон

Version: 1.02.0

Оно не работает

comment:2 Changed 4 years ago by Vasily Alferov

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

Вижу, что не работает. Первые ошибки тебе расскажет компилятор, там всё более-менее понятно.
Тут пока 0/10, как минимум потому, что не компилируется. Но лови подсказки про то, как исправлять неочевидные ошибки, которые у тебя неизбежно возникнут.

Про сам mergesort:

  • malloc(sizeof(array) / 2): поскольку array — это void*, то sizeof(array) == 8. Тут нужно пользоваться elements и element_size, по-другому не выйдет никаким образом.
  • temp1[i] = array[i]: пытаешься скопировать void, конечно, так не работает. Нужно memcpy.
  • temp1[i] <= temp2[j]: это то место, где нужно воспользоваться компаратором.

Стиль:

  • Пробел после скобок? Не надо, выглядит так себе. Тем более, что он у тебя не везде.

comment:3 Changed 4 years ago by Vasily Alferov

Version: 2.03.0

comment:4 Changed 4 years ago by Vasily Alferov

Ну вот, опять не компилируется =(

$ make
gcc -c -g -Iinclude -Wall -Wextra -Werror -fsanitize=address src/main.c -o obj/main.o
gcc -c -g -Iinclude -Wall -Wextra -Werror -fsanitize=address src/mergesort.c -o obj/mergesort.o
src/mergesort.c: In function ‘merge’:
src/mergesort.c:34:24: error: dereferencing ‘void *’ pointer [-Werror]
   if (comparator(&array[left + l], &array[middle + r]) < 0){
                        ^
... и ещё 10 таких же ошибок

Нельзя разыменовывать войд, нужно заменить на арифметику указателей.

Конкретно про твои баги:

  • В merge не обновляешь r в первом цикле.
  • Также помни про арифметику указателей: когда делаешь операции с void*, она работает в количествах байт: кое-где нужно какие-то части выражений домножить на element_size.

После фикса этих багов твой искусственный пример работает.

И не забывай: некрасиво мешать табы с пробелами.

Note: See TracTickets for help on using tickets.