Opened 3 years ago

Closed 3 years ago

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

WW3

Reported by: morozov.nikita Owned by: Святослав Власов
Component: WW_mergesort Version: 3.0
Keywords: Cc:

Description


Change History (5)

comment:1 Changed 3 years ago by Святослав Власов

Type: ожидается проверкаожидаются исправления
  1. Ворнинги компиляторов мы не любим, от них нужно избавиться. К тому же все ворнинги в твоем случае по существу.
  2. Строки не сортируются и портят память, на экране мусор, а valgrind ругается (а за возмущения валгринда -- уже автоматом идет 0/7)
  3. Если функция что-то возвращает, то инструкция return <значение> должна выполняться при любых вариантах работы функции, иначе она может вернуть мусор. У тебя для mergesort это не выполняется.

Корректность -- 0/7.

Стиль -- 0/3:

  1. Длинные строки (>80 символов) нужно разбивать на несколько. Примеры того, как строки должны разбиваться для условий, вызовов функций, объявлений функций и т.д. можешь посмотреть вот тут -- ​https://google.github.io/styleguide/cppguide.html#Formatting
  2. Не нужно жалеть пробелов вокруг знаков арифметических операций и пустых строк для разделения кода на смысловые блоки.
  3. Вот так обычно не пишут:
    }
    else {
    

Лучше писать

} else {
  1. Там, где ты копируешь память, лучше использовать синтаксис массивов, а не указателей.
  2. В main.c во всех циклах for у тебя пробелы расставлены не по людски.
  3. В main.c ты выделяешь динамический массив на стеке data[argc - 2], если входных данных слишком много -- стек переполнится.
  4. Что это за конструкция? char* a = &data;

data -- уже имеет тип int* -- это указатель на начало массива. &data имеет тип int** и это указатель на указатель на начало массива. Из-за этого ты пишешь совершенно не в свою память и корраптишь стек.

  1. При выводе данных не нужно городить макароны из арифметики указателей, пользуйся синтаксисом массивов.
  2. В случае сортировки строк твой алгоритм, который сначала находит максимальную длину, а потом копирует строки в один здоровый буфер, во-первых неоптимален по памяти -- представь себе входные данные из одной строки длиной тысячу символов и тысячи строк длиной в 1 символ, а во-вторых совершенно зазря копирует строки целиком при сортировке, что совершенно не нужно. Ты можешь в массиве хранить не сами строки, а указатели на них и сортировать указатели, вместо самих строк.
  3. Используешь необъявленную функцию strtol. Она объявлена в stdlib.h

comment:2 Changed 3 years ago by morozov.nikita

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

comment:3 Changed 3 years ago by Святослав Власов

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

Корректность 0/7
Валгринд по прежнему ругается на утечки при сортировке char'ов.

Стиль -- 2.8/3

  1. Всё равно почему-то жалеешь пустых строк для разделения кода на логические блоки. Открой, к примеру, исходник какого-нибудь файла написанного на си и посмотри как код в нем разделен пустыми строками на блоки. Постарайся сделать в своем файле что-то похожее.
  2. В заголовочном файле длинную строчку тоже стоит разбить.

comment:4 Changed 3 years ago by morozov.nikita

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

comment:5 Changed 3 years ago by Святослав Власов

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

10/10.

Бонус, к сожалению, ты не получаешь.
Потому что ты не проверяешь результат рекурсивных вызовов функции mergesort. Если в одном из них память выделить не удастся, то вызывающая функция об этом не узнает и продолжит работу.

Note: See TracTickets for help on using tickets.