Change History (5)

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

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

Программа не собирается -- корректность проверить не могу:

[842][svloyso:lab_03]$ make
mkdir -p obj
gcc -c -o obj/main.o -I include src/main.c
src/main.c: In function ‘cmp_str’:
src/main.c:12:8: error: ‘otr1’ redeclared as different kind of symbol
   12 |  char *otr1 = *str1;
      |        ^~~~
src/main.c:10:20: note: previous definition of ‘otr1’ was here
   10 | int cmp_str(void **otr1, void **otr2) {
      |             ~~~~~~~^~~~
src/main.c:12:16: error: ‘str1’ undeclared (first use in this function); did you mean ‘otr1’?
   12 |  char *otr1 = *str1;
      |                ^~~~
      |                otr1
src/main.c:12:16: note: each undeclared identifier is reported only once for each function it appears in
src/main.c:13:8: error: ‘otr2’ redeclared as different kind of symbol
   13 |  char *otr2 = *str2;
      |        ^~~~
src/main.c:10:33: note: previous definition of ‘otr2’ was here
   10 | int cmp_str(void **otr1, void **otr2) {
      |                          ~~~~~~~^~~~
src/main.c:13:16: error: ‘str2’ undeclared (first use in this function); did you mean ‘otr2’?
   13 |  char *otr2 = *str2;
      |                ^~~~
      |                otr2
src/main.c: In function ‘main’:
src/main.c:42:44: warning: passing argument 4 of ‘mergesort’ from incompatible pointer type [-Wincompatible-pointer-types]
   42 |  mergesort(argv, elements, sizeof(char *), cmp_str);
      |                                            ^~~~~~~
      |                                            |
      |                                            int (*)(void **, void **)
In file included from src/main.c:3:
include/mergesort.h:6:73: note: expected ‘int (*)(const void *, const void *)’ but argument is of type ‘int (*)(void **, void **)’
    6 | void mergesort(void *array, size_t elements, size_t element_size, int (*comparator)(const void*, const void*));
      |                                                                   ~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
src/main.c:66:27: warning: passing argument 2 of ‘strcmp’ makes pointer from integer without a cast [-Wint-conversion]
   66 | if (strcmp(argv[1], "int" == 0)) {
      |                     ~~~~~~^~~~
      |                           |
      |                           int
In file included from src/main.c:5:
/usr/include/string.h:140:50: note: expected ‘const char *’ but argument is of type ‘int’
  140 | extern int strcmp (const char *__s1, const char *__s2)
      |                                      ~~~~~~~~~~~~^~~~
src/main.c:69:14: warning: implicit declaration of function ‘atoi’ [-Wimplicit-function-declaration]
   69 |   array[i] = atoi(argv[i+2]);
      |              ^~~~
make: *** [Makefile:10: obj/main.o] Error 1

Замечания на текущий момент:

  1. Зачем счетчик объявлять вне цикла-for, когда можно сделать это прямо в цикле? И зачем вообще пользоваться тут синтаксисом указателей, когда синтаксис массивов тут будет смотреться намного понятнее и лаконичнее?
        size_t i;
        for (i = 0; i < elements * element_size; i++) {
            *res = *answ;
            res++;
            answ++;
        }
    
  2. Длинные строки (>80 символов) нужно разбить.
  3. Не пользуешься синтаксисом массивов там, где можно.
  4. Такая конструкция не делает ровным счетом ничего:
    (answ + (temp_l + temp_r) * element_size)++;
    

Ты увеличиваешь на единичку какой-то указатель, а не значение по нему.

  1. Съехали отступы в main
  2. Слишком много пустых строк в main.c Пустыми строками нужно выделять логические блоки и паузы, но не нужно их городить везде.
  3. Не нужно писать свой strcmp, можно воспользоваться библиотечным.
  4. Пробелы между элементами не выводишь.

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

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

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

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

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

  1. Символы не сортируются
  2. Программа падает с сегфолтом, если сортируемая строка одна.

Стиль -- 2/3.

  1. Синтаксис массивов? С ним сразу отпадет потребность в отдельных переменных a и answ.
        for (size_t i = 0; i < element_size * elements; i++) {
            *a = *answ;
            a++;
            answ++;
        }
    
  2. Какую значимую роль выполняет переменная low в функции mergesort?
  3. Кучи однотипной копи-пасты можно избежать, если ты вынесешь код копирующий один элемент в отдельную функцию.

comment:4 Changed 3 years ago by Tatiana Pridonyants

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

Исправила все, вроде как

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

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

9.7/10
Выводишь лишние пробелы в конце строки вывода.

Note: See TracTickets for help on using tickets.