2
GtkWidget *tree_view;
GtkListStore *tree_store;
GtkTreeModel *tree_model;
tree_store = gtk_list_store_new(4, G_TYPE_STRING,G_TYPE_STRING,G_TYPE_INT,G_TYPE_FLOAT);
tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(tree_store));
GtkTreeIter iter;
gtk_list_store_append(tree_store, &iter);

for(int j = 0; j < 2; j++) {
    GValue value = {0};
    g_value_init(&value, G_TYPE_STRING);
    g_value_set_string(&value, "1.0");
    gtk_list_store_set_value(tree_store, &iter, j, &value);
}
gtk_tree_model_iter_next(tree_model, &iter);

What I'm trying to do is move the iterator to the next row so I can insert another row of values. However, the last line results in a segfault. Why is this?

  • can you paste entire error – TheGameiswar Mar 27 '17 at 13:34
  • 1
    @TheGameiswar Segmentation fault (core dumped) –  Mar 27 '17 at 13:34
  • Hmmmm.. its been a while but I distinctly remember that you have to be careful with iterators when you are add/delete items in a collection, they may not be valid after a modification is made. http://stackoverflow.com/questions/6438086/iterator-invalidation-rules – Rob Mar 27 '17 at 13:38

1 Answers1

1

The iterator must be reset between rows, but the better way is to use gtk_list_store_set as opposed to set_value. My solution is this:

for(int i=0; i<num_rows; i++) {
    GtkTreeIter iter;
    gtk_list_store_append(tree_store, &iter);
    for(int j = 0; j < 2; j++) {

            GValue value = {0};
            g_value_init(&value, G_TYPE_STRING);
            g_value_set_string(&value, "1.0");
            gtk_list_store_set(tree_store, &iter, j, "1.0", -1);
            gtk_list_store_set(tree_store, &iter, j, "1.0", -1);
    }

}

So the iterator is recreated every time a row is inserted.