Opened 3 years ago

Closed 3 years ago

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

WW_mergesort kozlovceva.mariya

Reported by: Maria Kozlovtseva (kozlovceva.mariya) Owned by: Дмитрий Лапшин (lapshin)
Component: WW_mergesort Version:
Keywords: Cc:

Description

Ну, работает так себе пока, конечно) но код собирается... во что-то.
Но Вы всё равно скажите, что там не так.

Change History (6)

comment:1 Changed 3 years ago by Дмитрий Лапшин (lapshin)

Owner: changed from Дмитрий Лапшин (lapshin) to Maria Kozlovtseva (kozlovceva.mariya)
Type: ожидается проверкаожидаются исправления
Version: 1.0

Собирается, да. Всё, что не так, не скажу, но как минимум намекну.

Компараторы: не понимаю, зачем переменная, если её сразу return.

Ты пытаешься передать в mergesort массив argv. Как бы не хотелось, но от этого массив не начинает хранить числа или символы (а вот указатели на строчки действительно хранит, между прочим!). Можно было бы в теории в честь этого сортировать строчки, а в компараторах вспоминать, что же это на самом деле, но я бы не принял)

Я накостылял нормальное выделение массива чисел и передачу его в сортировку (у тебя даже в комментариях что-то похожее на правду было, только массивы на стеке не-не-не, это GCC язык расширяет), после этого починил пару проблем с памятью (утечки), и оно заработало хоть как-то (не падает, валгринд не орёт, но и не сортирует; уже ничего).

Ты делаешь на итерации mergesort два выделения памяти, причём они живут в момент рекурсии. Это сильно неоптимально, вообще можно одно выделение на итерацию, которое не пересекается с рекурсией, а то и вообще одно на всю сортировку.

И ключевое. В циклах сортировки никак не меняются left_elem и right_elem. Собственно, как встали в начале так и стоят. Видимо вот поэтому и не работает (на мой вкус, можно пачку переменных выкинуть и станет более рабочей).

Так что выглядит цивильно, но пока совсем не работает. Чини, время есть.

comment:2 Changed 3 years ago by Maria Kozlovtseva (kozlovceva.mariya)

Owner: changed from Maria Kozlovtseva (kozlovceva.mariya) to Дмитрий Лапшин (lapshin)
Type: ожидаются исправленияожидается проверка
Version: 2.0

Насчет компараторов: мне кажется, это делает код более читаемым и аккуратным, как, например, те же пустые строчки в коде. И препод по Котлину такой стиль, скорее, одобрял. Я исправила, но я предпочла бы и дальше так писать, если за это не будут снижать баллы за стиль. Как и предпочла бы выделять выражения вида "left + left_size * element_size" в отдельные переменные. Так что напишите, пожалуйста, можно мне так в следующих лабах делать или нет, потому что я привыкла к такому стилю.

Скажите, пожалуйста, сколько за это баллов и можно ли будет после ревью ещё исправить или уже нет.

comment:3 Changed 3 years ago by Дмитрий Лапшин (lapshin)

Owner: changed from Дмитрий Лапшин (lapshin) to Maria Kozlovtseva (kozlovceva.mariya)
Type: ожидается проверкаожидаются исправления
Version: 2.0

Я удивлён, что Котлин не рекомендовал писать а-ля

fun compare_strings(a: void *, b: void *) = strcmp(a, b)

Потому что кому нужны однострочные функции, когда можно ещё короче :)

Корректность теперь куда лучше. Снаружи заметная ошибка одна: не до конца соблюдаешь формат вывода.

Массивы на стеке всё ещё актуальны, потому что если дадут слишком много параметров сломаешься.

Ты не проверяешь результаты malloc хотя бы assert-ом.

Про потребление памяти и циклы тоже в силе.

Но 6 тут точно есть. Поисправляй ещё, одну посылку до полночи завтра даю точно. У лаб нет версий, не выставляй.

comment:4 Changed 3 years ago by Maria Kozlovtseva (kozlovceva.mariya)

Owner: changed from Maria Kozlovtseva (kozlovceva.mariya) to Дмитрий Лапшин (lapshin)
Type: ожидаются исправленияожидается проверка

Формат, массивы и проверку malloc сделала. Алгоритм подумала и исправила.
Там ещё бонусное задание сделано теперь.

comment:5 Changed 3 years ago by Maria Kozlovtseva (kozlovceva.mariya)

Исправила циклы. Что-то я действительно тупанула.

comment:6 Changed 3 years ago by Дмитрий Лапшин (lapshin)

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

Ты зачем-то закостылила крайний случай:

if (argc == 2) {
    printf("%s\n", "");
} else {

Во-первых, давай писать прилично:

if (argc == 2) {
    printf("\n");
    return;
}
// продолжаем тут

Но можно же и без него!

Вместо цикла вывода while я бы написал for:

for (size_t i = 0; i < elements; ++i) {
    if (i != 0)
        printf(" ");
     printf("%?", element[i]);
}

И ещё бы я не стеснялся делать memcpy на размер 0.

И кроме этих вопросов по стилю на -1 всё прекрасно и бонус есть, так что 10.

Note: See TracTickets for help on using tickets.