Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 调用qsort()函数_C_Gcc_Qsort_Function Prototypes - Fatal编程技术网

C 调用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

我正在写这个程序,它需要对一个表执行qsort()。我做完了 在互联网上进行了广泛的研究,但我仍然缺少一些东西。下面是 源代码的选定部分

#定义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调用中的编译器警告。