2015-11-19 85 views
0

如何在C中使用g_array_sort? 使用比較字符串我的代碼,但I'cant獲取數據g_array_sort不能在字符串上工作

int porownanie(gpointer a, gpointer b) 
{ 
char *str_a = (char *)a; char *str_b = (char *)b; 
    printf("[%s:%s]=%d\n",str_a,str_b,g_ascii_strcasecmp(str_a,str_b)); 
return strcmp(str_a,str_b); 
} 

主要功能

GArray* t = g_array_new(FALSE, FALSE, sizeof(char*)); 
char* a = "a", *b = "c", *c = "d".... 
g_array_append_val(t, a);.... 

prt(t);printf("Sortujemy\n"); g_array_sort(t, (GCompareFunc)porownanie); 
prt(t); printf("Porownanie %d\n",porownanie((char *)"a",(char *)"b")); 

我得到:

Tablica: b a f c d 
[z_:t_]=6 
[v_:x_]=-2 
[|_:v_]=6 
[|_:x_]=4 
[t_:v_]=-2 
[z_:v_]=4 
[z_:x_]=2 
[z_:|_]=-2 
Tablica: a c d b f 
[a:b]=-1 Porownanie -1 

我沒有得到的char *從g_aray_sort,我得到隨機數據

回答

1

排序函數接收指向要排序的項目的指針,而不是價值本身。你需要像

int porownanie(gpointer a, gpointer b) 
{ 
    char **str_a = (char **)a; char **str_b = (char **)b; 
    printf("[%s:%s]=%d\n",*str_a,*str_b,g_ascii_strcasecmp(*str_a,*str_b)); 
    return strcmp(*str_a,*str_b); 
} 

FWIW,這裏的理由是,該項目可以是任何東西,包括大型結構,你真的不希望複製周圍......想想會發生什麼,如果你有的

數組
struct Foo { 
    guint8 input_buffer[4096]; 
    guint8 output_buffer[4096]; 
} 

事實上,對於字符串,您通常會使用GPtrArray而不是GArray。排序函數仍然需要char **參數(因爲GPtrArray實際上只是GArray的一個便利API),但它假定值爲sizeof(void*),並且使API更易於使用。

+1

我無法投票。你的回答很好。工作 – user1415926535897

+0

很好的答案。 _好_ – user1415926535897