在第5章K& R C编程模块11中
有一个排序代码示例,用于解释函数指针。
我有两个问题。
main
函数中,为何投选(void**)lineptr
?此行中出现的指针类型不匹配
qsort1((void**)lineptr,0,nlines-1, (int (*)(void *,void*))(numeric ? numcmp : strcmp));
我仍然没有想出来解决这个错误。
您可以阅读以下代码
提前致谢。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLEN 1000
#define ALLOCSIZE 1000000 /*size of available space*/
#define MAXLINES 5000
char *lineptr[MAXLINES];
int readlines(char *lineptr[],int nlines);
void writelines(char *lineptr[] ,int nlines);
void qsort1(void *lineptr[],int left,int right , int (*comp)(void *,void *));
int numcmp(char *,char *);
int getline(char *,int);
char *alloc(int);
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
main(int argc , char *argv[]){
int nlines;
int numeric = 0; /*1 if numeric sort*/
if(argc > 1 && strcmp(argv[1],"-n") == 0)
numeric = 1;
if((nlines = readlines(lineptr,MAXLINES)) >= 0 ){
qsort1((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;
}
}
int readlines(char *lineptr[],int maxlines){
int len,nlines;
char *p,line[MAXLEN];
nlines = 0;
while((len = getline(line,MAXLEN)) > 0 )
if(nlines >= maxlines || (p=alloc(len)) == NULL)
return -1;
else{
line[len-1] = '\0';
strcpy(p,line);
lineptr[nlines++] = p;
}
}
void writelines(char *lineptr[],int nlines){
int i;
for(i=0;i<nlines;i++)
printf("%s\n",lineptr[i]);
}
void qsort1(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);
qsort1(v,left,last-1,comp);
qsort1(v,last+1,right,comp);
}
int numcmp(char *s1,char *s2)
{
double v1,v2;
v1 = atof(s1);
v2 = atof(s2);
if(v1<v2)
return -1;
else if(v1>v2)
return 1;
else
return 0;
}
void swap(void *v[],int i, int j){
void *temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
int getline(char *s,int max){
int c,i;
for(i=0 ; (c=getchar()) != EOF && c != '\n';i++)
*s++ = c;
if(c == '\n'){
*(s+i) = c;
i++;
}
*(s+i) = '\0';
return i;
}
char *alloc(int n)
{
if(allocbuf + ALLOCSIZE - allocp >= n){
allocp += n;
return allocp - n;
}else
return 0;
}