On 12/1/97 3:10 AM, Chris Jacobson (fear@athenet.net) stated:
>I'm having WIERD errors after I did a major upgrade of my code.
>
>The basics of the problem is this:
>the character is being removed from the character_list, flagged
>"purged", and put into another list.
>A loop later on runs through character_list, and lo and behold, that
>character is STILL in character_list, flagged "purged", AND points back
>to itself.
>
>I searched for EVERY occurance of "next" in the source, scanned them over
>three times to make sure there was no wierd source error...
>Made it log when it was marking characters "purged" and when it
>encounters characters marked "purged" but it shouldn't.
>Made it even make sure it was finding the character in character_list,
>then ALSO making sure it wasn't finding it a second time (i.e, that it
>might be in the list twice).
>
>So its wierd... very wierd. Im wondering, has anyone ever had a problem
>of ch->next == ch, and what did you notice was causing the problem?
>
Ok I don't know how ch->next =='d ch, but the probs are gone.
My main problem was also the disappearance/reappearance in
character_list, and it was in mob_act.
Well, because a character can get purged in mob_act, it sets next_ch to
ch->next right away. What was happening was ch->next was actually
getting extracted (and removed from character_list) right away in ch's
events. This caused the program to stop on my OTHER catches, and made it
appear to be in the list. Usign some logging and %x's (aren't they
wonderful :-) I realized that next_ch was pointing to a possibly purged
character, and so made a new variable, prev, that was set in the for
loop. Now it looks like:
for (ch = character_list, i = 1, prev = NULL; ch; prev = ch, ch =
next_ch, i++) {
next_ch = ch->next;
if (prev && (prev->next != ch))
ch = prev->next;
if (!ch)
continue;
Well, that solved my problems...
- Chris Jacobson
PS. I ported over several of Death's Gate (Circle based, C++) features to
my own MUD (which is still plain C, Im staying away from C++). The
features include: the script system (very powerful, and basically
crashproof), a few minor enhancements, and the non-immediate extraction
(anything extracted isn't free'd until game_loop).
+------------------------------------------------------------+
| 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