Я пишу эту программу, которая должна выполнять 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? Откуда это и в чем смысл? Возможно, мне следовало бы поставить этот побочный вопрос либо на загадку, либо на ретрокомпьютинг.)