Re: GList empty after iteration?



Am 12.09.2011 21:10, schrieb Craig:
Hi All,

I am confused about GList. My application is parsing a file and creating
midi data with it. I am using GList to store the midi data.  I have
created a GtkListStore to view the parsed data (to insure I am parsing
the data properly).  So, below I iterate through the GList and "copy"
the data into a tree view.  But, I am shocked to see that after I
iterate through the GList, I cannot iterate through the list again.  I
have debugged the list after the iteration with g_list_length(events)
which shows the list length at 0.  What is up with this?  The first
while loop has data, the second while loop has not data. The code is
below-->

        GtkTreeIter tree_iter;
        events = g_list_reverse(events);
        events = g_list_first(events);
        while(events)
        {
                gtk_list_store_append (list_store,&tree_iter);
                struct midi_event *me = events->data;
                gtk_list_store_set(list_store,&tree_iter,
                                   0, me->time_stamp,
                                   1, me->event_type,
                                   2, me->message1,
                                   3, me->message2,
                                  -1);
                events = g_list_next(events);           
        }
        /// this is where the list appears to be empty!!!!
        events = g_list_first(events);
        while(events)
        {
                g_print("midi event \n");
                events = g_list_next(events);           
        }

Thanks for any help!

This is because you overwrite "events" in the first loop until it is NULL ("while (events)"). So when you do "g_list_first(events)" afterwards, you naturally get NULL back.

You should use another GList pointer to iterate through the list, like so:


        GtkTreeIter tree_iter;
        GList *l;
        events = g_list_reverse(events);
        events = g_list_first(events);

        for (l = events; l; l = l->next)
        {
                gtk_list_store_append (list_store,&tree_iter);
                struct midi_event *me = l->data;
                gtk_list_store_set(list_store,&tree_iter,
                                   0, me->time_stamp,
                                   1, me->event_type,
                                   2, me->message1,
                                   3, me->message2,
                                  -1);
        }

        for (l = events; l; l = l->next)
        {
                g_print("midi event \n");
        }

Regards,
Denis



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]