当前位置: 首页 > 知识库问答 >
问题:

调用 qsort() 函数

甄霖
2023-03-14

我正在编写这个程序,它需要在表上执行 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,我会收到警告消息:警告:从不兼容的指针类型 [-Wincompatible-指针类型] 传递“qsort”的参数 4]

如果我将 e35 更改为 (e35)(const void*)(const void*)),我会得到:错误:“const”之前的预期表达式和错误:函数“e35”的参数太少

如果我将其更改为错误:e35(星号)(常量无效*)(常量无效*))我得到:错误:“)”标记之前的预期表达式 错误:函数“e35”的参数太少,错误:“const”之前的预期表达式

我错过了什么?我相信 gcc 不知道 e35 是一个函数,而不是一个变量或数组

我以前使用过 qsort(),但这是第一次在 gcc 下使用。以前,我在 TurboC 下使用它,我只需要函数的名称 e35。

我正在使用 Debian Linux 下的 gcc 进行编译。qsort() 的目的是我稍后反复搜索表,并希望能够更快地执行此操作。

(附带问题,只是为了好玩:为什么我把比较例程称为 e35?这是从哪里来的,意义何在?也许我应该把这个侧面问题放在令人费解或逆向计算上。

共有1个答案

经骁
2023-03-14

使用 int 返回。删除不必要的转换。比较。避免减法溢出。

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);
}
 类似资料:
  • 在下面的代码中,一旦我删除了比较字符串的注释部分,我就会出现seg 11错误。我无法理解为什么!其余代码运行良好。感谢任何帮助!

  • qsort(利用快速排序法排列数组) 相关函数 bsearch 表头文件 #include<stdlib.h> 定义函数 void qsort(void * base,size_t nmemb,size_t size,int ( * compar)(const void *, const void *)); 函数说明 参数base指向欲排序的数组开头地址,参数nmemb代表数组中的元素数量,每一元

  • qsort 利用快速排序法排列数组 相关函数 bsearch 表头文件 #include<stdlib.h> 定义函数 void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); 函数说明 参数base指向欲排序的数组开头地址,参数nmemb代

  • 描述 (Description) C库函数void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))对数组进行排序。 声明 (Declaration) 以下是qsort()函数的声明。 void qsort(void *base, size_t nitems, size_t

  • Python内置了很多有用的函数,我们可以直接调用。 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档: http://docs.python.org/2/library/functions.html 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息。 调用abs函数: >>> abs(100) 100 >

  • Python内置了很多有用的函数,我们可以直接调用。 要调用一个函数,需要知道函数的名称和参数,比如求绝对值的函数abs,只有一个参数。可以直接从Python的官方网站查看文档: http://docs.python.org/3/library/functions.html 也可以在交互式命令行通过help(abs)查看abs函数的帮助信息。 调用abs函数: >>> abs(100) 100 >

  • qsort快速排序函数是C语言的高阶函数,支持用于自定义排序比较函数,可以对任意类型的数组进行排序。本节我们尝试基于C语言的qsort函数封装一个Go语言版本的qsort函数。 2.6.1 认识qsort函数 qsort快速排序函数有<stdlib.h>标准库提供,函数的声明如下: void qsort( void* base, size_t num, size_t size, i

  • 问题内容: 我要实现的目标 我有一些要展示的作品。所以,我有这些的缩略图。当访客单击缩略图时,我希望打开一个div(称为slickbox)并显示标题,说明和有关所单击作品的滑块。 我已经完成的工作以及如何 从数据库中获取工作数据。这是我的作品清单的一小部分: index.php 如您所见,我有一个ul标签,其中每个作品都包含li标签。每个li标签获取数据库中工作的ID,每个li标签包含h3标签和p