C 调用qsort()函数
我正在写这个程序,它需要对一个表执行qsort()。我做完了 在互联网上进行了广泛的研究,但我仍然缺少一些东西。下面是 源代码的选定部分C 调用qsort()函数,c,gcc,qsort,function-prototypes,C,Gcc,Qsort,Function Prototypes,我正在写这个程序,它需要对一个表执行qsort()。我做完了 在互联网上进行了广泛的研究,但我仍然缺少一些东西。下面是 源代码的选定部分 #定义NOSLACK uu属性u((打包)) #定义TABWIDTH 100/*大表的宽度*/ #定义TABSIZE 100/*大表中的条目数*/ 结构要素 {char flags;/*与此任务相关的标志*/ short int tasknum;/*此任务的编号(不包括任何步骤编号)*/ short int numpre;/*此任务的预需求数量*/ short
#定义NOSLACK uu属性u((打包))
#定义TABWIDTH 100/*大表的宽度*/
#定义TABSIZE 100/*大表中的条目数*/
结构要素
{char flags;/*与此任务相关的标志*/
short int tasknum;/*此任务的编号(不包括任何步骤编号)*/
short int numpre;/*此任务的预需求数量*/
short int numpost;/*此任务具有的PostReq数*/
短int PREREQ[0];/*PREREQ表(如果numpre=0则省略)*/
短int-postreqs[0];/*postreqs表(如果numpost=0则省略)*/
char fragment[TABWIDTH/*描述符的片段-*/
-sizeof(char)/*tion;尽可能多*/
-sizeof(短整数)*3];}NOSLACK;
/*上述所有字段的长度总和应为TABWIDTH*/
struct ELEMEN bigtable[TABSIZE];
短整数e35(常数无效*,常数无效*);
短int main(int argc,char*argv[])
qsort(g.bigtable、numelem、TABWIDTH、/*使用e35()的排序表)*/
e35);//tasknum,/*排序依据*/
(短int*)和((struct ELEMEN*)elem2)->tasknum,/*任务编号*/
sizeof(短)
));
问题在于对qsort()的调用。如果最后一个参数只是e35,我会得到警告消息:警告:从不兼容的指针类型[-Wincompatible指针类型]传递'qsort'的参数4
如果我将e35更改为(e35)(const void*)(const void*),我会得到:error:expected
“const”之前的表达式和错误:函数“e35”的参数太少
如果我将其更改为error:e35(星号)(const void*)(const void*),我会得到:error:expected expression before')标记错误:函数“e35”的参数太少,错误:expected expression before'const'
我错过了什么?我相信gcc不知道e35是一个函数,而不是一个变量或数组
我以前使用过qsort(),但这是第一次使用gcc。以前,我在TurboC下使用过它,在TurboC中,我只需要函数名e35
我在DebianLinux下使用gcc进行编译。qsort()的作用是我以后反复搜索表,并希望能够更快地搜索
(附带问题,只是为了好玩:为什么我要调用比较例程e35?它来自哪里,意义何在?也许我应该把这个附带问题放在puzzing或retrocomputing上。)使用
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);
}
inte35(常数void*elem1,常数void*elem2){
常量结构元素*t1=elem1;
常量结构元素*t2=elem2;
返回(t1->tasknum>t2->tasknum)-(t1->tasknumtasknum);
}
函数应返回int
,而不是short int
。不相关,这是一种非常昂贵的比较两个短值的方法。@WhozCraig谢谢。我已将e35()更改为返回int,而不是short int。我不理解比较两个短值的部分;由于表可能包含数百个条目,对已排序表进行二进制搜索不是更快吗?memcmp(/*into-se-*/(short-int*)和((struct-ELEMEN*)elem1)->tasknum,/*quence by*/(short-int*)和((struct-ELEMEN*)elem2)->tasknum,/*任务编号*/sizeof(短)
是一种逐字节级别的排序,而不是一种short
排序。实际上,它依赖于endian。你的比较器。如果你想比较两个短值,那么就比较两个短值。memcmp的诡计是昂贵的,依赖于endian,最终是毫无意义的。此外,你的字段试图将TABWIDTH作为精确的元素大小i这既危险又是假设性的。编译器可以随意执行成员对齐,qsort会很高兴地相信你给它的值作为元素大小,不管它有多大的错误。使用sizeof*bigtable
作为元素大小。不管怎样,我看不出任何原因,一旦修复了rettype,该调用应该会警告nything.这个结构很奇怪。如果我见过的话,这两个零长度数组是wtf材料。这就是为什么这段代码要用成员大小计算进行曲棍球比赛。我理解目标,但不能同意方法。不管怎样,函数的retval修复应该解决qsort调用中的编译器警告。