代码之家  ›  专栏  ›  技术社区  ›  Tool

指向函数的指针:无法编译

  •  1
  • Tool  · 技术社区  · 16 年前
    #include <stdio.h>
    #include <string.h>
    
    #define MAXLINES 5000
    char *lineptr[MAXLINES];
    
    int readlines(char *lineptr[], int nlines);
    void writelines(char *lineptr[], int nlines);
    
    void qsort(void *lineptr[], int left, int right, int (*comp)(void *, void *));
    
    int numcmp(char *, char *);
    
    int main(int argc, char *argv[])
    {
        int nlines;
        int numeric = 0;
    
        if(argc > 1 && strcmp(argv[1], "-n") == 0)
           numeric = 1;
        if((nlines = readlines(lineptr, MAXLINES)) >= 0) {
            qsort((void **) lineptr, 0, nlines - 1, (int (*)(void *, void *))(numeric ? numcmp : strcmp));
            writelines(lineptr, nlines);
            return 0;
        } else {
               printf("input too big to sort\n");
               return 1;
        }
    
    
    }
    
    void qsort(void *v[], int left, int right, int(*comp)(void *, void *))
    {
         int i, last;
         void swap(void *v[], int, int);
    
         if(left >= right)
            return;
    
         swap(v, left, (left + right) / 2);
         last = left;
         for(i = left + 1; i <= right; i++) 
            if((*comp)(v[i], v[left]) < 0)
               swap(v, ++last, i);
         swap(v, left, last);
         qsort(v, left, last - 1, comp);
         qsort(v, last + 1, right, comp);
    }
    

    这是K&R的直接源代码,在章节指针和函数中,这是他们展示的关于指向函数的指针的示例,但我不能编译在其中调用qsort的行(第22行)。我明白这一点:

    22 C:\Users\SUZI\Desktop\solutions\Chapter 5\Exercise 5-14\sort.c conditional expression between distinct pointer types `int (*)(char*, char*)' and `int (*)(const char*, const char*)' lacks a cast 
    
    22 C:\Users\SUZI\Desktop\solutions\Chapter 5\Exercise 5-14\sort.c invalid conversion from `int (*)(char*, char*)' to `void*' 
    
    22 C:\Users\SUZI\Desktop\solutions\Chapter 5\Exercise 5-14\sort.c invalid conversion from `int (*)(const char*, const char*)' to `void*' 
    
    2 回复  |  直到 14 年前
        1
  •  5
  •   codaddict    16 年前

    尝试将第22行更改为:

    qsort((void **) lineptr, 0, nlines - 1, (numeric ? (int (*)(void *, void *))numcmp : (int (*)(void *, void *))strcmp));
    
        2
  •  6
  •   bmargulies    16 年前

    您使用的是ANSI C编译器,而不是旧的K&R C编译器。

    错误信息非常清楚,请查看 const 不匹配。将函数更改为与qsort函数要求的签名相同,然后在内部强制转换参数。