Вызов функции qsort () - PullRequest
       73

Вызов функции qsort ()

0 голосов
/ 02 ноября 2019

Я пишу эту программу, которая должна выполнять qsort () для таблицы. Я провел обширные исследования в Интернете, но я все еще что-то упускаю. Ниже выделены отдельные части исходного кода.

#define NOSLACK __attribute__((packed))

#define TABWIDTH 100                                 /* width of big table */

#define TABSIZE 100                      /* number of entries in big table */

struct ELEMEN 
   {char flags;                           /* flags pertaining to this task */
    short int tasknum;  /* number of THIS task (excluding any step number) */
    short int numpre;                   /* number of prereqs this task has */
    short int numpost;                 /* number of postreqs this task has */
    short int prereqs[0];      /* table of prereqs (omitted if numpre = 0) */
    short int postreqs[0];   /* table of postreqs (omitted if numpost = 0) */
    char fragment[TABWIDTH                    /* fragment of the descrip-  */
     - sizeof(char)                           /* tion; as much as will fit */
     - sizeof(short int) * 3];} NOSLACK;

           /* the lengths of all the above fields should total to TABWIDTH */

    struct ELEMEN bigtable[TABSIZE];

short int e35(const void*, const void*);

short int main(int argc, char* argv[])

    qsort(g.bigtable, numelem, TABWIDTH,         /* sort table using e35() */
     e35);                                         // <--- PROBLEM HERE

short int e35(const void* elem1, const void* elem2)         /* sort tasks  */
   {return(memcmp(                                          /* into se-    */
     (short int*)&((struct ELEMEN*)elem1)-> tasknum,        /* quence by   */
     (short int*)&((struct ELEMEN*)elem2)-> tasknum,        /* task number */
     sizeof(short)
     ));

Проблема в вызове qsort (). Если последний параметр - просто e35, я получаю предупреждающее сообщение: warning: передача аргумента 4 из 'qsort' из несовместимого типа указателя [-Wincompatible-pointer-types]

Если я изменю e35 на (e35) (const void *) (const void *)), я получаю: error: ожидаемое выражение перед 'const' и error: слишком мало аргументов для функции 'e35'

Если я изменю его на ошибку: e35 (звездочка)(const void *) (const void *)) Я получаю: error: ожидаемое выражение перед ')' ошибка токена: слишком мало аргументов для функции 'e35' и error: ожидаемое выражение перед 'const'

Что такоеЯ скучаю? Я полагаю, что gcc не знает, что e35 является функцией, а не переменной или массивом.

Я использовал qsort () раньше, но это первый раз в gcc. Ранее я использовал его в TurboC, где все, что мне нужно, это имя функции, e35.

Я компилирую с использованием gcc под Debian Linux. Цель qsort () состоит в том, чтобы я несколько раз просматривал таблицу позже и хотел, чтобы это можно было сделать быстрее.

(Дополнительный вопрос, просто для забавы: почему я вызвал процедуру сравненияс35? Откуда это и в чем смысл? Возможно, мне следовало бы поставить этот побочный вопрос либо на загадку, либо на ретрокомпьютинг.)

1 Ответ

0 голосов
/ 02 ноября 2019

Используйте возврат int. Бросьте ненужные броски. Сравните как short. Избегайте вычитания переполнения.

int e35(const void* elem1, const void* elem2) {
  const struct ELEMEN* t1 = elem1;
  const struct ELEMEN* t2 = elem2;
  return (t1->tasknum > t2->tasknum) - (t1->tasknum < t2->tasknum);
}
...