Подскажите, где ошибка (указатель на функцию) - C (СИ)
Формулировка задачи:
Дана программа в книге Кернигана и Ричи (5.11. Указатели на функцию)
Почему она с ошибками.
#include <stdio.h> #include <string.h> #define MAXLINES 5000 //max lines to be sorted char *lineptr[MAXLINES]; int readlines(char *lineptr[], int maxlines); void writelines(char *lineptr[], int nlines); void qsort(void *lineptr[], int left, int right, int (*comp) (void *, void *)); int numcmp(char *s1, char *s2); /* sort input lines */ int main(int argc, char *argv[]) { int nlines; //number of input lines read int numeric; // 1 if numeric sort 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 swap(void *lineptr[], int i, int j); /* qsort: sort v[left]...v[right] into increasing order */ void qsort(void *lineptr[], int left, int right, int (*comp) (void *, void *)) { int i, last; if(left >= right) //do nothing if array contains return; //fewer than two elements swap(lineptr, left, (left + right)/2); last = left; for(i = left + 1; i <= right; i++) if((*comp) (lineptr[i], lineptr[left]) < 0) swap(lineptr, ++last, i); swap(lineptr, left, last); qsort(lineptr, left, last - 1, comp); qsort(lineptr, last + 1, right, comp); } #include <stdlib.h> /* numcmp: compare s1 and s2 numericalli */ 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 *lineptr[], int i, int j) { void *temp; temp = lineptr[i]; lineptr[i] = lineptr[j]; lineptr[j] = temp; }
gcc -Wall -o "point_to_func" "point_to_func.c" -lm
point_to_func.c: In function ‘main’:
point_to_func.c:25:52: warning: pointer type mismatch in conditional expression [enabled by default]
Compilation failed.
In file included from point_to_func.c:56:0:
/usr/include/stdlib.h: At top level:
/usr/include/stdlib.h:761:13: error: conflicting types for ‘qsort’
point_to_func.c:39:6: note: previous definition of ‘qsort’ was here
Решение задачи: «Подскажите, где ошибка (указатель на функцию)»
textual
Листинг программы
#include <stdio.h> #include <string.h> #define MAXLINES 5000 //max lines to be sorted #define BUFSIZE 5000 char *lineptr[MAXLINES]; int readlines(char *lineptr[], char *buf, int maxlines); void writelines(char *lineptr[], int nlines); void sort(void *v[], int left, int right, int (*comp) (void *, void *)); int numcmp(char *s1, char *s2); /* sort input lines */ int main(int argc, char *argv[]) { int nlines; //number of input lines read int numeric; // 1 if numeric sort char buf[BUFSIZE]; numeric = 0; if(argc > 1 && strcmp(argv[1], "-n") == 0) numeric = 1; if((nlines = readlines(lineptr,buf, MAXLINES)) >= 0) { sort((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; } } /* sort: sort v[left]...v[right] into increasing order */ void sort(void *v[], int left, int right, int (*comp) (void *, void *)) { int i, last; void swap(void *v[], int i, int j); if(left >= right) //do nothing if array contains return; //fewer than two elements 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); sort(v, left, last - 1, comp); sort(v, last + 1, right, comp); } #include <stdlib.h> /* numcmp: compare s1 and s2 numericalli */ 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; } #define MAXLEN 1000 //max lenght of any input line int getlin(char *, int); /* readlines: read input lines */ int readlines(char *lineptr[], char *buf, int maxlines) { int len, nlines; char line[MAXLEN]; char *p = buf; char *bufstop = buf + BUFSIZE; nlines = 0; while((len = getlin(line, MAXLEN)) > 0) { if(nlines >= maxlines || p + len > bufstop) return -1; else { line[len - 1] = '\0'; //delete newline strcpy(p, line); lineptr[nlines++] = p; p += len; } } return nlines; } /* writelines: write output lines */ void writelines(char *lineptr[], int nlines) { int i; printf("\n"); for(i = 0; i < nlines; i++) printf("%s\n", lineptr[i]); } int getlin(char *l, int lim) { int c; char *tmp = l; for(; --lim > 0 && (c=getchar()) != EOF && c!='\n'; l++) *l = c; if(c=='\n') *l++ = c; *l = '\0'; return l - tmp; }
Объяснение кода листинга программы
- Объявлен массив
lineptr
типаchar *lineptr[MAXLINES]
, который предназначен для хранения указателей на строки, введенные пользователем. - Функция
readlines
используется для чтения строк из стандартного ввода и сохранения их вlineptr
. Она возвращает количество прочитанных строк. - Функция
writelines
используется для вывода строк из массиваlineptr
на стандартный вывод. - Функция
sort
предназначена для сортировки массива строк или чисел в порядке возрастания. Она использует функцию сравненияcomp
для определения порядка сортировки. - Функция
numcmp
используется в функцииsort
для сравнения двух строк на числовой порядок. - Функция
swap
используется в функцииsort
для обмена элементов массива. - Функция
getlin
используется в функцииreadlines
для чтения строки с учетом ограничения на длину строки. - Функция
main
является точкой входа в программу. Она обрабатывает ввод/вывод и вызывает функции сортировки и чтения/записи строк. - Переменная
nlines
используется в функцииmain
для хранения количества прочитанных строк. - Переменная
numeric
используется в функцииmain
для указания, следует ли сортировать строки в числовом порядке. - Переменная
buf
используется в функцииreadlines
для временного хранения считанных строк. - Переменная
left
используется в функцииsort
для указания начала подмассива для сортировки. - Переменная
right
используется в функцииsort
для указания конца подмассива для сортировки. - Переменная
last
используется в функцииsort
для хранения индекса опорного элемента в подмассиве. - Переменная
i
используется в функцииsort
для итерации по элементам подмассива. - Переменная
j
используется в функцииsort
для указания индекса элемента, который нужно сравнить с опорным элементом. - Переменная
temp
используется в функцииswap
для временного хранения значения одного из элементов массива. - Переменная
len
используется в функцииgetlin
для хранения длины прочитанной строки. - Переменная
c
используется в функцииgetlin
для хранения считанного символа. - Переменная
l
используется в функцииgetlin
для итерации по символам прочитанной строки.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д