int e35(const void* elem1, const void* elem2) {
struct ELEMEN* t1 = elem1;
struct ELEMEN* t2 = elem2;
return (t1->tasknum > t2->tasknum) - (t1->tasknum < t2->tasknum);
}
我正在编写此程序,该程序需要在表上执行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:从不兼容的指针类型[-Wincompatible-pointer-types]
传递“ qsort”的参数4如果我将e35更改为(e35)(const void *)(const void *)),则会得到:错误:预期'const'之前的表达式和错误:函数'e35']的参数太少
如果将其更改为错误:e35(星号)(const无效*)(const无效*))我得到:错误:')'标记之前的预期表达式标记错误:函数'e35'的参数太少,错误:预期'const'之前的表达式
我想念的是什么?我相信gcc不知道e35是函数,而不是变量或数组。
我以前使用过qsort(),但这是gcc下的第一次。以前,我在TurboC下使用过它,我所需要的只是函数名称e35。
我正在Debian Linux下使用gcc进行编译。 qsort()的目的是我稍后重复搜索该表,并希望能够更快地执行该操作。
<<我正在编写此程序,该程序需要在表上执行qsort()。我已经在互联网上进行了广泛的研究,但仍然缺少一些东西。以下是源代码的选定部分。 #...
int
返回。比较为short
。避免减法溢出。int e35(const void* elem1, const void* elem2) {
struct ELEMEN* t1 = elem1;
struct ELEMEN* t2 = elem2;
return (t1->tasknum > t2->tasknum) - (t1->tasknum < t2->tasknum);
}