g_array_sort не работает со строкой
Как использовать g_array_sort для строк в C? Мой код использует строку сравнения, но я не могу получить данные
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 - это на самом деле просто удобный API для GArray), но она предполагает, что значения sizeof(void*)
и делает API немного проще в использовании.