我在编写本书第5.11节中介绍的示例程序时遇到了问题.我删除了大部分代码,只留下了相关内容.
#define MAXLINES 5000
char *lineptr[MAXLINES];
void qsort1(void *lineptr[], int left, int right, int (*comp)(void *, void *));
int numcmp(char *, char *);
main(int argc, char *argv[]) {
int numeric = 1;
/* ... */
qsort1((void**) lineptr, 0, 100, (int (*)(void*, void*))(numeric ? numcmp : strcmp));
}
void qsort1(void *v[], int left, int right, int (*comp)(void *, void *)) {
/* ... */
}
int numcmp(char *s1, char *s2) {
/* ... */
}
Run Code Online (Sandbox Code Playgroud)
问题是代码无法编译(我正在使用Digital Mars编译器).我得到的错误是这样的:
qsort1((void**) lineptr, 0, nlines - 1, (int (*)(void*, void*))(numeric
? numcmp : strcmp));
^
go.c(19) : Error: need explicit cast to convert
from: int (*C func)(char const *,char const *)
to : int (*C func)(char *,char *)
--- errorlevel 1
Run Code Online (Sandbox Code Playgroud)
虽然我正确地粘贴了书中的代码,但声明必定有问题.我不知道做出正确的更改(关于函数指针的部分当然可以更广泛地编写).
编辑:我应该提到我正在阅读本书的ANSI版本.
我认为错误来自于旧的C还不知道const的事实:strcmp有两个指向非const字符的指针(char *)我认为(这可能是它编译的原因,但不是你的编译器).但是,现在strcmp采取char const*(const char*是同样的事情).将您的函数原型更改为:
int numcmp(char const*, char const*);
Run Code Online (Sandbox Code Playgroud)