Re: Circlemud design issues

From: James Turner (turnerjh@XTN.NET)
Date: 04/21/98


Angus Mezick <angus@EDGIL.CCMAIL.COMPUSERVE.COM> writes:

> James,
> What does the example you give have to do with Macros?
>
> Your first example could be a Macro (the char_in_room(ch)) and the function
> still requires knowledge of the *next pointer.
>
> Your second example needs more code to make sense.  How are
> chars_in_room_iterator(), next(), and iter_to_ch() defined for the present
> structure?
>
> All you have to be careful, C give you enoungh rope to tie a couple of nooses,
> just don't put you neck into it.

Here's a quick, tiny, implementation.

struct char_list {
  struct list *next;
  struct char_data *ch;
};

struct room {
  struct obj_list *objects;
  struct char_list *people;
  ...
};

struct char_data first_in_room(struct room *r)
{
  assert(r);
  assert(r->people);

  return r->people->ch;
}

So, the following would work:

struct char_list *l;

for (l = first_in_room(r); l; l = l->next) {
  blah(l->ch);
}

Or, we could do it like this:

struct iterator { /* or call it a general list */
  struct iterator *next;
  void *data;
};

Then implement similar to the above, with

iter_to_char(iterator *i);

simply casting and returning (perhaps at a later time having type
checking or something).

Iterator next() would simply return i->next.

Does this help any, or would more examples help things more?

--
James Turner               turnerjh@xtn.net
                           http://www.vuse.vanderbilt.edu/~turnerj1/


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/15/00 PST