我需要使用函数g_array_sort(GArray *array, GCompareFunc *func)
但我不明白第二个参数。使用g_array_sort函数
请告诉我应该如何被调用,如果可能的话请附上一个样品例如....
我需要使用函数g_array_sort(GArray *array, GCompareFunc *func)
但我不明白第二个参数。使用g_array_sort函数
请告诉我应该如何被调用,如果可能的话请附上一个样品例如....
这是一个开放源码库,所以你可以看看的g_array_sort()
本身的代码。只需输入g_array_sort到Google's code search即可获得代码。
在那里你可以看到这个函数实际上调用libc的qsort(3),并将你感兴趣的函数传递给qsort。
现在,Linux的qsort man page有一个很好的例子qsort使用。
g_array_sort()
的第二个参数是指向函数的指针。如果你看一下GCompareFunc的文档,你会发现它是一个函数,它有两个指针,并返回一个int:
gint (*GCompareFunc) (gconstpointer a, gconstpointer b);
的文档还告诉你,这个功能应该做的:
的函数应返回一个负整数,如果第一个值在第二个值之前出现,如果它们相等,则返回0;如果第一个值在第二个值之后,则返回一个正整数。
因为您没有指定要存储在数组中的数据类型,所以我只会使用字符串。你的排序功能会是这个样子:
int my_string_sort_function (gconstpointer a, gconstpointer b)
{
char *str_a = (char *)a;
char *str_b = (char *)b;
return strcmp (str_a, str_b);
}
如果你的阵列中存储号码,你可以做类似
int my_int_sort_function (gconstpointer a, gconstpointer b)
{
int int_a = GPOINTER_TO_INT (a);
int int_b = GPOINTER_TO_INT (b);
return int_a - int_b;
}
要与g_array_sort
g_array_sort (my_array, my_int_sort_function);
添加使用这些功能iain的答案的一个例子。
这是显示GArray函数(包括'g_array_sort()')的效果的示例。可以看到,排序之后,int数组列出以升序:代码
/*
* file: garray_test.c
* compile: gcc -o g_array garray_test.c `pkg-config --cflags --libs glib-2.0`
*/
#include <glib.h>
void display_array(GArray *array, int len, const char *prompt)
{
int i = 0;
printf("%s: \n", prompt);
for (i = 0; i < len; i++) {
printf("%d ", g_array_index(array, int, i));
}
printf("\n");
}
int my_int_sort_function (gconstpointer a, gconstpointer b)
{
int * int_a = (int *) a;
int * int_b = (int *) b;
return (*int_a) - (*int_b);
}
int main(int argc, char *argv[])
{
GArray *array = NULL;
int i = 0;
int cur_arr_len = 0;
int len = 0;
array = g_array_new(FALSE, TRUE, sizeof(int));
printf("Current length of array is %d\n", array->len);
len = 0;
for (i = 10; i < 15; i++) {
g_array_append_val(array, i);
len++;
}
cur_arr_len += len;
display_array(array, cur_arr_len, "Create array");
int app_data[] = {30, 40, 50, 60};
int app_len = sizeof(app_data)/sizeof(int);
g_array_append_vals(array, app_data, app_len);
cur_arr_len += app_len;
display_array(array, cur_arr_len, "After append values 30 40 50 60");
len = 0;
for (i = 1; i < 4; i++) {
g_array_prepend_val(array, i);
len++;
}
cur_arr_len += len;
display_array(array, cur_arr_len, "After prepend value 1 2 3");
int prepend_data[] = {-10, -20, -30, -40};
int prepend_len = sizeof(prepend_data)/sizeof(int);
g_array_prepend_vals(array, prepend_data, prepend_len);
cur_arr_len += prepend_len;
display_array(array, cur_arr_len, "After prepend values -10 -20 -30 -40");
int data = 100;
g_array_insert_val(array, 5, data);
cur_arr_len += 1;
display_array(array, cur_arr_len, "After insert 100 at index 5");
g_array_remove_index(array, 5);
cur_arr_len -= 1;
display_array(array, cur_arr_len, "After remove value at index 5");
g_array_remove_index_fast(array, 10);
cur_arr_len -= 1;
display_array(array, cur_arr_len, "After remove value at index 10 fast");
g_array_sort (array, my_int_sort_function);
display_array(array, cur_arr_len, "Try to sort the array");
g_array_free(array, TRUE);
}
结果以上:
Current length of array is 0
Create array:
10 11 12 13 14
After append values 30 40 50 60:
10 11 12 13 14 30 40 50 60
After prepend value 1 2 3:
3 2 1 10 11 12 13 14 30 40 50 60
After prepend values -10 -20 -30 -40:
-10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60
After insert 100 at index 5:
-10 -20 -30 -40 3 100 2 1 10 11 12 13 14 30 40 50 60
After remove value at index 5:
-10 -20 -30 -40 3 2 1 10 11 12 13 14 30 40 50 60
After remove value at index 10 fast:
-10 -20 -30 -40 3 2 1 10 11 12 60 14 30 40 50
Try to sort the array:
-40 -30 -20 -10 1 2 3 10 11 12 14 30 40 50 60