Предполагая (из вашего обращения к 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()
принимает блок сравнения (также известный как закрытие) вместо функции, и этот блок может захватывать контекст от вызывающей стороны.
person
Caleb
schedule
13.04.2019
G
не является частьюa
иb
, то единственный способ получить доступ кG
- это сделатьG
статической переменной области файла или просто старой простой глобальной переменной. - person user3386109   schedule 13.04.2019typedef
дляVertices
отсутствует - вы делаете его указателем:typedef struct VerticeSt *Vertices;
? Есть ли у васqsort_r()
? Похоже, это вам очень поможет. Остерегайтесь, версияqsort_r()
в Linux (библиотека GNU C) отличается от версии в * BSD и macOS - они имеют эквивалентную функциональность, но разный порядок аргументов. - person Jonathan Leffler   schedule 13.04.2019