Opened 5 years ago

Closed 5 years ago

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

WW #4

Reported by: tarasov.denis Owned by: Sokolov Viacheslav
Component: WW_mergesort Version: 2.0
Keywords: Cc:

Description


Change History (3)

comment:1 Changed 5 years ago by Sokolov Viacheslav

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

Проверка контрактов! https://wiki.compscicenter.ru/index.php/C%2B%2B_1MIT_осень_1_2019#.D0.A2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BA.D0.BE.D1.80.D1.80.D0.B5.D0.BA.D1.82.D0.BD.D0.BE.D1.81.D1.82.D0.B8.2C_.D0.BF.D1.80.D0.B5.D0.B4.D1.8A.D1.8F.D0.B2.D0.BB.D1.8F.D0.B5.D0.BC.D1.8B.D0.B5_.D0.BA_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D0.B0.D0.BC

swap нигде не используется

Понимаю мотивацию, стоящую за попыткой универсализации:

  char *data_c = NULL;
  int *data_i = NULL;
  char *data_s = NULL;
  char *data = NULL;
  int i;
  size_t el_size, type = 0;
  int (*comparator)(const void *a, const void *b);

но... общего кода - всего две строчки:

mergesort(data, argc - 2, el_size, comparator);

и

free(data);

Кажется, более удачное решение - в каждом из случаев решать конкретную задачу. Сейчас overhead на обобщение больше, чем выгода от него. Это особенность языка Си - именно на этом языке не очень удобно писать переиспользуемый код. В Си++ с этим все намного лучше.

`

size_t str_size = strlen(argv[i]) + 2;

`
кажется, +2 не в том месте.

Для сортировки строк аллокация не нужна. Для других сортировок на самом деле можно тоже обойтись без аллокации (становится дороже оператор сравнения), но и аллокация является нормальным решением.

В реализации merge на самом деле можно обойтись одним циклом while, если в нем предполагать, что один из указателей уже достиг границы. Но сейчас тоже неплохо.

comment:2 Changed 5 years ago by tarasov.denis

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

comment:3 Changed 5 years ago by Sokolov Viacheslav

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

Потеряна константность в компараторах.

Выгода от попытки обобщения осталась неясна.

swap не используется. (лишний код).

Контракты: что, если (n1 + n2) * el_size переполнится?

el_size == 0?

n == 0?

Note: See TracTickets for help on using tickets.