Тема: Приклад 5.11 із книги КіР
Автори підручника розраховують на те, що читач при виконанні коду буде складати його на основі уже напрацьованого на протязі читання книги.
Ось те що вийшло у мене:
#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 *v[], int left, int right, int (*comp)(void *, void *));
int numcmp(const char *, const 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("Too much lines\n");
return 1;
}
}
#include <stdlib.h>
#define MAXLEN 1000 /* max length of any input line */
int getline(char *, int);
char *alloc(int);
/* readlines: read input lines */
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'; /* delete newline */
strcpy(p, line);
lineptr[nlines++] = p;
}
return nlines;
}
int getline(char *s, int max){
int i=0;
while((*s = getchar()) != '\n' && *s != EOF && i < max-1){
s++;
i++;
}
if(*s == EOF)
return 0;
if(*s == '\n')
*s++ = '\n';
i++;
*s = '\0';
return i;
}
/* writelines: write output lines */
void writelines(char *lineptr[], int nlines){
while (nlines-- > 0)
printf("%s\n", *lineptr++);
}
int numcmp(const char *s1, const 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;
}
#define ALLOCSIZE 10000 /* size of available space */
static char allocbuf[ALLOCSIZE]; /* storage for alloc */
static char *allocp = allocbuf; /* next free position */
char *alloc(int n) /* return pointer to n characters */
{
if (allocbuf + ALLOCSIZE - allocp >= n) { /* it fits */
allocp += n;
return allocp - n; /* old p */
} else /* not enough room */
return 0;
}
Проблема полягає в тому, що ми опрацьовуємо функцію qsort, тому прописуємо її власноруч, однак вона міститься в заголовковій бібліотеці <stdlib.h>, і визначена вона в ній інакше, тож компілятор реагує на це
C:\Program Files\PellesC\Include\stdlib.h(94): error #2120: Redeclaration of 'qsort', previously declared at C:\Users\YaR\Desktop\Creative\Programming\C\Kernighan\5.11example\main.c(9); expected 'void __cdecl function(void * *, int, int, int __cdecl (*)(void *, void *))' but found 'void __cdecl function(void *, unsigned int, unsigned int, int __cdecl (*)(const void *, const void *))'.
Ця бібліотека потрібна для того, щоб використати функцію atof(), так, її можна написати вручну, проте цікаво чи є якісь інші способи вирішення цієї проблеми?