Предполагая (из вашего вызова qsort()
), что G->orden
указывает на базу массива значений типа u32
с длиной G->n
, тогда значения, передаваемые в вашу функцию сравнения, будут указателями на элементыиз этого массива.Ваша функция Compare()
должна приводить переданные ей указатели void*
к указателям на тип, о котором она знает, и затем разыменовывать их, чтобы получить фактические значения, которые она будет сравнивать.
Вот короткая программа, котораяпоказывает все в действии:
#include <stdio.h>
#include <stdlib.h>
typedef unsigned long u32;
int Compare(const void* a, const void* b) {
u32 x1 = *(u32*)a; // Get the array element that a points to
u32 x2 = *(u32*)b; // Get the array element that b points to
if (x1 < x2) // Compare the values and return result
return -1;
else if (x1 == x2)
return 0;
else return 1;
}
void printArray(char* label, u32* a, int n) {
printf("%s", label);
for (int i = 0; i < n; i++)
printf("\t%lu", (unsigned long)a[i]);
printf("\n");
}
int main(int argc, const char* argv[]) {
u32 array[5] = {9, 3, 27, 18, 6};
printArray("unsorted: ", array, 5);
qsort(array, 5, sizeof(u32), Compare);
printArray(" sorted: ", array, 5);
return 0;
}
И вот результат:
unsorted: 9 3 27 18 6
sorted: 3 6 9 18 27
Сравните в qsort получите два параметра const void a, const void b.Мне нужно, чтобы Compare получил три параметра const void a const void b Grafo G.
В этом случае qsort()
, вероятно, не совсем подходящая для вас функция.Есть также qsort_r()
и qsort_b()
.qsort_r()
принимает дополнительный параметр void*
, который также передается в функцию сравнения, и это звучит ближе всего к тому, что вам нужно - вы можете передать указатель на ваш G
в этом параметре.qsort_b()
принимает вместо функции блок сравнения (он же замыкание), и этот блок может захватывать контекст из вызывающей стороны.