2011-03-28 2 views
0

g_array_sort(GArray *array, GCompareFunc *func) 함수를 사용해야하지만 두 번째 매개 변수를 이해할 수 없습니다.g_array_sort 함수 사용

답변

1

당신이 g_array_sort() 자체의 코드를 살펴 수 있도록이 오픈 소스 라이브러리입니다 .... 그것을 호출 가능하면하는 샘플 예제를 첨부 해주세요되어야하는지 보여주세요. g_array_sort를 Google's code search에 입력하면 코드가 생성됩니다.

이 함수는 실제로 libc의 qsort (3)를 호출하고 관심있는 함수를 변경하지 않고 qsort로 전달한다는 것을 알 수 있습니다.

이제 Linux의 qsort man page에는 qsort 사용의 좋은 예가 있습니다.

2

g_array_sort()의 두 번째 인수는 함수에 대한 포인터입니다.

gint (*GCompareFunc) (gconstpointer a, gconstpointer b); 

문서는이 기능이해야 할 일을 설명 : 당신이 GCompareFunc에 대한 설명서를 보면 당신은 int를 두 개의 포인터를 받아 반환하는 함수입니다 것을 볼 수

함수는 첫 번째 값이 두 번째 값보다 작 으면 음의 정수를 반환하고 같으면 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); 
} 

당신은 g_array_sort

g_array_sort (my_array, my_int_sort_function); 
1

추가로 이러한 기능을 사용하려면

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()'를 비롯한 GArray 함수의 효과를 보여주는 예입니다. 위의 코드의

/* 
* 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 
당신은 그 종류 후에 int 배열이 오름차순으로 나열되어 볼 수 있습니다