<Grid container className={classes.demo} justify="center" spacing={Number(spacing)}>
Я думаю, что ошибка прибывает из того, что старый C еще не знал константу: strcmp там взял два указателя на символы неконстанты (char *
) я думаю (который мог быть причиной, почему она скомпилировала тогда, но не с Вашим компилятором). Однако в наше время strcmp берет char const*
(const char*
то же самое). Измените своего прототипа функции на это:
int numcmp(char const*, char const*);
Это - типичная проблема :)
Следующая строка говорит 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*)
Указатель стандартной функции, ожидаемый qsort()
или bsearch()
имеет прототип:
int comparator(const void *v1, const void *v2);
qsort1()
определенный в коде ожидает:
int comparator(void *v1, void *v2);
Функции, определяемые компаратора в коде не имеют того прототипа, и между различными типами указателя функции нет никакого автоматического преобразования.
Так, фиксирует для qsort1()
также:
(int (*)(void *, void *))
, илиПерепишите компараторы:
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
спецификаторы, как в первой версии этого ответа.
Отметьте это strcmp
берет два аргумента константы, тогда как Ваш numcmp
не делает. Поэтому типы этих двух функций не соответствуют, и ? :
оператор будет жаловаться.
Сделайте один из:
numcmp
соответствовать strcmp
прототип с точки зрения constnessпродвиньте (int (*)(void*, void*))
бросок в ? :
, например.
numeric ? (int (*)(void*, void*))numcmp : (int (*)(void*, void*))strcmp
Его некоторое время, так как я сделал любое чистое программирование C, я не уверен относительно нового стандарта.
Однако кастинг для освобождения ** создает указатель на указатель, где функция требует указателя на массив. Несомненно, они - то же самое внутренне, но сильный typechecking поймает это как ошибку.
перепишите qsort для принятия ** вместо * [], и необходимо быть в порядке.