У меня есть функция сравнения для использования в qsort() следующим образом:
int compar(const void *p, const void *q){
interval a,b;
*p = (interval)a
*q = (interval)b;
if(a.extrem[1] < b.extrem[0])
return -1;
if(b.extrem[1] < a.extrem[0] )
return 1;
return 0;
}
Моя структура выглядит следующим образом:
typedef struct interval{
double extrem[2];
} interval;
Я пробовал много вариантов «приведения» в функции сравнения, и все они потерпели неудачу. Мой вопрос, как видно, как я могу применить const void* к моему элементу структуры? Я знаю, что это кажется очень простым вопросом, но я нигде не мог найти четкого ответа, к тому же я новичок в этом. Любая помощь приветствуется.
a = *(interval*)p;
, вероятно, это то, что вы имели в виду. - person Tavian Barnes   schedule 26.05.2016struct
или из него. Вы можете привестиvoid*
к типу указателя или из него. (На самом деле преобразование можно выполнить неявно, без приведения.) - person Keith Thompson   schedule 26.05.2016qsort
принимает аргумент, указывающий размер вашего типа, поэтому он точно знает, насколько велик элемент. И поскольку он заботится только о байтах, которые имеет каждый элемент, а не о его типе, это совершенно нормально. В то время как рассматриваемая функция просто ожидает, что по существу бестиповый указатель будет указывать на объект точного типа, что ужасно. - person notadam   schedule 26.05.2016qsort
принимает указатель на функциюint (*compar)(const void *, const void *)
. Он не принимает указатель на функциюint (*compar)(const interval *, const interval *)
. - person Tavian Barnes   schedule 26.05.2016qsort()
, это не его вина. :) - person unwind   schedule 26.05.2016void*
действительно было бы плохой практикой. - person notadam   schedule 26.05.2016if(a.extrem[1] <b.extrem[0])return -1; if(b.extrem[1]<a.extrem[0])return 1;
, учитывая его асимметрию. Непонятно, чего хочет ОП. - person chux - Reinstate Monica   schedule 26.05.2016compar(a, b) == 0 && compare(b, c) == 0
, ноcompar(a, c) == -1
. - person Tavian Barnes   schedule 26.05.2016