C GTK - SIGSEGV при попытке получить порядковый номер последнего элемента в TreeView - PullRequest
1 голос
/ 09 апреля 2020

Я пытаюсь получить значение индекса выбранного элемента в GTK TreeView, чтобы использовать этот индекс для удаления этого значения из соответствующего массива значений. Мой код делает это успешно для всех элементов TreeView, кроме последнего в списке. Я получаю эту ошибку при попытке удалить последний элемент:

(SDS-CW:32229): Gtk-CRITICAL **: 00:07:38.494: gtk_list_store_get_path: assertion 'iter->stamp == priv->stamp' failed

(SDS-CW:32229): Gtk-CRITICAL **: 00:07:38.494: gtk_tree_path_get_indices: assertion 'path != NULL' failed

Вот мой код:

void remove_hash(GtkWidget *widget, gpointer user_data) {

    struct data *dataStruct = user_data;

    GtkListStore *store;
    GtkTreeModel *model;
    GtkTreeIter iter;
    GtkTreePath *path;
    GtkTreeSelection *selectedHash = dataStruct->selectedHash;
    int removeIndex;

    store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
    model = gtk_tree_view_get_model(GTK_TREE_VIEW(list));

    if (gtk_tree_model_get_iter_first(model, &iter) == FALSE) {
        return;
    }

    if (gtk_tree_selection_get_selected(GTK_TREE_SELECTION(selectedHash), &model, &iter)) {
        gtk_list_store_remove(store, &iter);
    }

    path = gtk_tree_model_get_path(model, &iter);   <-- This appears to be returning NULL
    removeIndex = *gtk_tree_path_get_indices(path) + 1;   <-- Error occurs here, I believe

    g_print("Remove Index: %i\n", removeIndex);
    g_print("Remove Hash: %s\n", dataStruct->queuedHashes[removeIndex][0]);

    // Function continues below, but error occurs above

Кто-нибудь знает, где я могу пойти не так?

Любая помощь будет принята с благодарностью, спасибо.

1 Ответ

1 голос
/ 09 апреля 2020

Согласно Gtk3 do c, gtk_list_store_remove

Удаляет данную строку из хранилища списка. После удаления iter устанавливается как следующая действительная строка или становится недействительной, если она указала на последнюю строку в list_store.

Вам необходимо получить removeIndex перед вызовом gtk_list_store_remove.

...