Подскажите, где ошибка (указатель на функцию) - 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;
}

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

  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
Похожие ответы