Подскажите, где ошибка (указатель на функцию) - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Дана программа в книге Кернигана и Ричи (5.11. Указатели на функцию)
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3. #define MAXLINES 5000 //max lines to be sorted
  4. char *lineptr[MAXLINES];
  5. int readlines(char *lineptr[], int maxlines);
  6. void writelines(char *lineptr[], int nlines);
  7. void qsort(void *lineptr[], int left, int right,
  8. int (*comp) (void *, void *));
  9. int numcmp(char *s1, char *s2);
  10. /* sort input lines */
  11. int main(int argc, char *argv[])
  12. {
  13. int nlines; //number of input lines read
  14. int numeric; // 1 if numeric sort
  15. numeric = 0;
  16. if(argc > 1 && strcmp(argv[1], "-n") == 0)
  17. numeric = 1;
  18. if((nlines = readlines(lineptr, MAXLINES)) >= 0)
  19. {
  20. qsort((void**)lineptr, 0, nlines - 1,
  21. (int (*) (void*, void*)) (numeric ? numcmp : strcmp));
  22. writelines(lineptr, nlines);
  23. return 0;
  24. }
  25. else
  26. {
  27. printf("input too big to sort\n");
  28. return 1;
  29. }
  30. }
  31. void swap(void *lineptr[], int i, int j);
  32. /* qsort: sort v[left]...v[right] into increasing order */
  33. void qsort(void *lineptr[], int left, int right,
  34. int (*comp) (void *, void *))
  35. {
  36. int i, last;
  37. if(left >= right) //do nothing if array contains
  38. return; //fewer than two elements
  39. swap(lineptr, left, (left + right)/2);
  40. last = left;
  41. for(i = left + 1; i <= right; i++)
  42. if((*comp) (lineptr[i], lineptr[left]) < 0)
  43. swap(lineptr, ++last, i);
  44. swap(lineptr, left, last);
  45. qsort(lineptr, left, last - 1, comp);
  46. qsort(lineptr, last + 1, right, comp);
  47. }
  48. #include <stdlib.h>
  49. /* numcmp: compare s1 and s2 numericalli */
  50. int numcmp(char *s1, char *s2)
  51. {
  52. double v1, v2;
  53. v1 = atof(s1);
  54. v2 = atof(s2);
  55. if(v1 < v2)
  56. return -1;
  57. else if(v1 > v2)
  58. return 1;
  59. else
  60. return 0;
  61. }
  62. void swap(void *lineptr[], int i, int j)
  63. {
  64. void *temp;
  65. temp = lineptr[i];
  66. lineptr[i] = lineptr[j];
  67. lineptr[j] = temp;
  68. }
Почему она с ошибками.
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
Листинг программы
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. #define MAXLINES 5000 //max lines to be sorted
  6. #define BUFSIZE 5000
  7.  
  8. char *lineptr[MAXLINES];
  9. int readlines(char *lineptr[], char *buf, int maxlines);
  10. void writelines(char *lineptr[], int nlines);
  11.  
  12. void sort(void *v[], int left, int right,
  13.             int (*comp) (void *, void *));
  14. int numcmp(char *s1, char *s2);
  15.  
  16. /* sort input lines */
  17. int main(int argc, char *argv[])
  18. {
  19.     int nlines; //number of input lines read
  20.     int numeric; // 1 if numeric sort
  21.     char buf[BUFSIZE];
  22.    
  23.     numeric = 0;
  24.     if(argc > 1 && strcmp(argv[1], "-n") == 0)
  25.         numeric = 1;
  26.     if((nlines = readlines(lineptr,buf, MAXLINES)) >= 0)
  27.     {
  28.         sort((void **)lineptr, 0, nlines - 1,
  29.             (int (*) (void*, void*)) (numeric ? numcmp : strcmp));
  30.         writelines(lineptr, nlines);
  31.         return 0;
  32.     }
  33.     else
  34.     {
  35.         printf("input too big to sort\n");
  36.         return 1;
  37.     }
  38. }
  39.  
  40.  
  41.  
  42. /* sort: sort v[left]...v[right] into increasing order */
  43. void sort(void *v[], int left, int right,
  44.             int (*comp) (void *, void *))
  45. {
  46.     int i, last;
  47.     void swap(void *v[], int i, int j);
  48.    
  49.     if(left >= right) //do nothing if array contains
  50.         return;       //fewer than two elements
  51.     swap(v, left, (left + right)/2);
  52.     last = left;
  53.     for(i = left + 1; i <= right; i++)
  54.         if((*comp) (v[i], v[left]) < 0)
  55.             swap(v, ++last, i);
  56.     swap(v, left, last);
  57.     sort(v, left, last - 1, comp);
  58.     sort(v, last + 1, right, comp);
  59. }
  60.  
  61. #include <stdlib.h>
  62.  
  63. /* numcmp: compare s1 and s2 numericalli */
  64. int numcmp(char *s1, char *s2)
  65. {
  66.     double v1, v2;
  67.    
  68.     v1 = atof(s1);
  69.     v2 = atof(s2);
  70.     if(v1 < v2)
  71.         return -1;
  72.     else if(v1 > v2)
  73.         return 1;
  74.     else
  75.         return 0;
  76. }
  77.  
  78. void swap(void *v[], int i, int j)
  79. {
  80.     void *temp;
  81.     temp = v[i];
  82.     v[i] = v[j];
  83.     v[j] = temp;
  84. }
  85.  
  86. #define MAXLEN 1000 //max lenght of any input line
  87.  
  88.  
  89. int getlin(char *, int);
  90.  
  91. /* readlines: read input lines */
  92. int readlines(char *lineptr[], char *buf, int maxlines)
  93. {
  94.     int len, nlines;
  95.  
  96.     char line[MAXLEN];
  97.    
  98.     char *p = buf;    
  99.     char *bufstop = buf + BUFSIZE;
  100.    
  101.     nlines = 0;
  102.     while((len = getlin(line, MAXLEN)) > 0)
  103.     {
  104.         if(nlines >= maxlines || p + len > bufstop)
  105.             return -1;
  106.         else
  107.         {
  108.             line[len - 1] = '\0'; //delete newline
  109.             strcpy(p, line);
  110.             lineptr[nlines++] = p;
  111.             p += len;
  112.         }
  113.     }
  114.     return nlines;
  115. }
  116.  
  117. /* writelines: write output lines */
  118. void writelines(char *lineptr[], int nlines)
  119. {
  120.     int i;
  121.    
  122.     printf("\n");
  123.     for(i = 0; i < nlines; i++)
  124.         printf("%s\n", lineptr[i]);
  125. }
  126.  
  127. int getlin(char *l, int lim)
  128. {
  129.     int c;
  130.     char *tmp = l;
  131.     for(; --lim > 0 && (c=getchar()) != EOF && c!='\n'; l++)
  132.         *l = c;
  133.     if(c=='\n')
  134.         *l++ = c;
  135.     *l = '\0';
  136.     return l - tmp;
  137. }

Объяснение кода листинга программы

  1. Объявлен массив lineptr типа char *lineptr[MAXLINES], который предназначен для хранения указателей на строки, введенные пользователем.
  2. Функция readlines используется для чтения строк из стандартного ввода и сохранения их в lineptr. Она возвращает количество прочитанных строк.
  3. Функция writelines используется для вывода строк из массива lineptr на стандартный вывод.
  4. Функция sort предназначена для сортировки массива строк или чисел в порядке возрастания. Она использует функцию сравнения comp для определения порядка сортировки.
  5. Функция numcmp используется в функции sort для сравнения двух строк на числовой порядок.
  6. Функция swap используется в функции sort для обмена элементов массива.
  7. Функция getlin используется в функции readlines для чтения строки с учетом ограничения на длину строки.
  8. Функция main является точкой входа в программу. Она обрабатывает ввод/вывод и вызывает функции сортировки и чтения/записи строк.
  9. Переменная nlines используется в функции main для хранения количества прочитанных строк.
  10. Переменная numeric используется в функции main для указания, следует ли сортировать строки в числовом порядке.
  11. Переменная buf используется в функции readlines для временного хранения считанных строк.
  12. Переменная left используется в функции sort для указания начала подмассива для сортировки.
  13. Переменная right используется в функции sort для указания конца подмассива для сортировки.
  14. Переменная last используется в функции sort для хранения индекса опорного элемента в подмассиве.
  15. Переменная i используется в функции sort для итерации по элементам подмассива.
  16. Переменная j используется в функции sort для указания индекса элемента, который нужно сравнить с опорным элементом.
  17. Переменная temp используется в функции swap для временного хранения значения одного из элементов массива.
  18. Переменная len используется в функции getlin для хранения длины прочитанной строки.
  19. Переменная c используется в функции getlin для хранения считанного символа.
  20. Переменная l используется в функции getlin для итерации по символам прочитанной строки.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

13   голосов , оценка 4.077 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы