Проблема, компилирующая пример K&R

<Grid container className={classes.demo} justify="center" spacing={Number(spacing)}>
5
задан Ree 5 March 2009 в 22:25
поделиться

5 ответов

Я думаю, что ошибка прибывает из того, что старый C еще не знал константу: strcmp там взял два указателя на символы неконстанты (char *) я думаю (который мог быть причиной, почему она скомпилировала тогда, но не с Вашим компилятором). Однако в наше время strcmp берет char const* (const char* то же самое). Измените своего прототипа функции на это:

int numcmp(char const*, char const*);
9
ответ дан 18 December 2019 в 13:19
поделиться

Это - типичная проблема :)

Следующая строка говорит qsort ожидать указатель на функцию с двумя пустыми* параметры. К сожалению, strcmp берет две немодифицируемых строки следовательно, это - подпись,

int (*comp)(const char*, const char*)

вместо того, что Вы имеете:

int (*comp)(void *, void *)

Измените подпись обоих qsort1 и numeric:

qsort1(void *v[], int left, int right, int (*comp)(const void *, const void *))

и:

int numcmp(const char*, const char*)
2
ответ дан 18 December 2019 в 13:19
поделиться

Указатель стандартной функции, ожидаемый qsort() или bsearch() имеет прототип:

int comparator(const void *v1, const void *v2);

qsort1() определенный в коде ожидает:

int comparator(void *v1, void *v2);

Функции, определяемые компаратора в коде не имеют того прототипа, и между различными типами указателя функции нет никакого автоматического преобразования.

Так, фиксирует для qsort1() также:

  1. Представьте бросок: (int (*)(void *, void *)), или
  2. Перепишите компараторы:

    int numcmp(void *v1, void *v2)
    {
        char *s1 = v1;
        char *s2 = v2;
        ...
    }
    
    int str_cmp(void *v1, void *v2)  // Note new function name!
    {
        return(strcmp(v1, v2));
    }
    

Очевидно, вызов к qsort1() сослался бы str_cmp вместо strcmp. Авторы стремились избежать промежуточной функции, но ссориться с (законно) более суетливыми компиляторами, используемыми в наше время.

Стандартная версия qsort() потребовал бы набора const спецификаторы, как в первой версии этого ответа.

2
ответ дан 18 December 2019 в 13:19
поделиться

Отметьте это strcmp берет два аргумента константы, тогда как Ваш numcmp не делает. Поэтому типы этих двух функций не соответствуют, и ? : оператор будет жаловаться.

Сделайте один из:

  1. изменение numcmp соответствовать strcmp прототип с точки зрения constness
  2. продвиньте (int (*)(void*, void*)) бросок в ? :, например.

    numeric ? (int (*)(void*, void*))numcmp : (int (*)(void*, void*))strcmp
    
1
ответ дан 18 December 2019 в 13:19
поделиться

Его некоторое время, так как я сделал любое чистое программирование C, я не уверен относительно нового стандарта.

Однако кастинг для освобождения ** создает указатель на указатель, где функция требует указателя на массив. Несомненно, они - то же самое внутренне, но сильный typechecking поймает это как ошибку.

перепишите qsort для принятия ** вместо * [], и необходимо быть в порядке.

0
ответ дан 18 December 2019 в 13:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: