LINUX.ORG.RU

странное поведение gtk_combo_box_insert_text

 ,


0

1

всех с прошедшим днем веб-разработчика.
коротко о главном:

имеется динамический массив структур pAccount, count глобальный счетчик кол-ва элементов массива. Задача проста, при помощи combobox выводить список элементов этого массива.

// там выше добавляется новый элемент в массив структур

int i = 0;

count++;

// очищаем combobox
while (i++ < count)
    gtk_combo_box_remove_text(GTK_COMBO_BOX(widget),i);

// сортируем массив структур
qsort(pAccount,count,sizeof(struct account),qsort_compare);
i = 0;

// заполняем combobox отсортированным списком
// первый эелемент combobox всегда пустой
while (i < count)
{
    gtk_combo_box_insert_text(GTK_COMBO_BOX(widget),i+1,(pAccount+i)->service);
    gtk_combo_box_remove_text(GTK_COMBO_BOX(widget),i+2); // осторожно гребаная ГРАБЛЯ
    i++;
}

немного пояснений:

  1. изначально combobox содержит один пустой элемент, как заполняется массив структур не важно, он заполняется и заполняется правильно
  2. после count++ переменная содержит кол-во элементов массива
  3. циклом while зачищаем весь combobox кроме первого элемента, он всегда пустой
  4. сортируем массив (сортируется он правильно)
  5. в конце концов заполняем combobox отсортированным массивом (первый элемент всегда пустой)


Вот на 5 шаге и возникает трабла, на первой итерации элемент инсертится нормально, а вот на всех последующих почему-то дважды. Я проверял, цикл проходит правильное кол-во итераций, но в итоге если у нас к примеру 5 элементов в массиве, то в combobox окажется первый пустой, потом 5 нужных отсортированных элементов и еще 4 вразнобой повторяющихся. Пришлось добавить граблю что б работало как надо, но это же не по феншую.

В общем вопрос к тем кто имел дело с этой ф-цией, это я туплю или в libgtk2.0-dev - 2.20.1 действительно криво реализована данная ф-ция?

Ответ на: комментарий от MKuznetsov

0_o
допустим count = 3
идем по итерациям:

1. i = 0 < count = 3
i = 1, delete first elem
2. 1 < 3
i = 2, delete second elem
3. 2 < 3
i = 3, delete third elem
4. 3 < 3
i = 4, get out

Aluminium ()
Ответ на: комментарий от Aluminium

когда удаляешь элемент с индексом скажем k, его место занимает k+1. в строке «gtk_combo_box_remove_text(GTK_COMBO_BOX(widget),i);» i замени на 0 и всё будет пучком

MKuznetsov ★★★★★ ()
Ответ на: комментарий от MKuznetsov

ииитить-колотить, как я до этого не додумался?!
спасибо милый человек

Aluminium ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.