On Thursday, August 21, 1997 9:35 AM, George
[SMTP:greerga@DRAGON.HAM.MUOHIO.EDU] wrote:
> I recommend this construct for every for() loop in CircleMUD:
>
> for (toy = get_buffer_head(); toy; toy = toy->next)
> if (toy == toy->next) {
> log("SYSERR: BUF: do_buffer: Infinite loop!");
> toy->next = NULL;
> } else if (!toy->used && toy->size == size &&
A tricky thing that is easy to forget:
Consider the following (broken) code:
for (vict=world[ch->in_room].people;vict;vict=vict->next)
send_to_char("blah",vict);
Here's a better version:
for (vict=world[ch->in_room].people;vict;vict=vict->next_in_room)
send_to_char("blah",vict);
The best (?) version: (slower though)
struct char_data *vict, *next_vict, *last_vict=NULL;
for (vict=world[ch->in_room].people;vict;vict=next_vict) {
next_vict = vict->next_in_room;
if ( (last_vict == vict) || (next_vict == vict) ) {
log("SYSERR: Your character list is messed up.. so sad :-)");
exit(1);
}
send_to_char("blah",vict);
last_vict = vict;
}
I remember being stumped by the strangest bug in a piece of code I was
writing
some months back. A few hundred lines of code and it's was acting very
strange. Had the above problems with looping, and other random affects.
Turned out I had forgotten to use next_in_room..
Good one to put in the memory banks if you are susceptible to doing stupid
stuff like the above :-)
--Mallory
I can picture in my mind a world without war, a world without hate.
And I can picture us attacking that world, because they'd never
expect it. - Jack Handey
+------------------------------------------------------------+
| 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/08/00 PST