Re: help with linked lists



Peter Jay Salzman wrote:
>    typedef struct {
>       SDL_Surface *img;
>       int magnitude;
>       SDL_Rect rect;
>    } ChargeStruct;
> 
> and i have a double linked list of them:
> 
>    GList *ChargeList = NULL;
> 	ChargeStruct puck;
> 	...
> 	ChargeList = g_list_append (ChargeList, &puck);

Hi Peter,

Is ChargeStruct a local? You probably want to allocate space for a 
struct of the heap, and then add a pointer to that area to your list.

   ChargeStruct *puck = g_new (ChargeStruct);

   ChargeList = g_list_append (ChargeList, puck);

(also, _prepend() is much faster if you don't care about having the 
order reversed)

(also GList keeps forwards and back pointers ... if you just want a 
one-way list, you can use GSList (singly-linked list) and save a little 
space)

(also the usual convention is to use MixedCaps for type names, and 
underscore_names for variables ... so I'd call ChargeList charge_list)

Of course, you'll need something to g_free() all these pucks when you're 
done with them.

>   ChargeStruct *ChargeClicked(GList *ChgList, SDL_Event event)
>   {
>      GList *ptr;
>      int x, y;
>   
>      while (ptr != NULL) {
>         ptr = g_list_next(ChgList);
>         x = ptr->data->rect.x;
>         y = ptr->data->rect.y;
>         if (event.button.x > x - 10 && event.button.x < x + 10) {
>            printf("click\n");
>         }
>      }
>      return(ptr->data);
>   }

You need to init ptr to the start of your list, and you need to cast ptr 
to ChargeStruct* (the compiler does not know what sort of thing you have 
in your list ... it just sees a dumb pointer).

the usual g_idiom for iterating over lists is

   GList *i;

   for( i = ChargeList; i; i = i->next ) {
     ChargeStruct *puck = (ChargeStruct *) i->data;

     if( puck->rect.x ... etc.
   }

John



========================================================== 
Aelbert Cuyp 13 February - 12 May 2002 

For information and tickets: 
http://www.nationalgallery.org.uk



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