Re: [Circle] newbie fighting question

From: Niese-Petersen (Tenp@cris.com)
Date: 07/30/96


On Mon, 29 Jul 1996, Charles Canning wrote:

> Hi,
> 
> I was just wondering why this is considered safer? I see no difference in 
> the two. Both will crash if i = NULL. So what's up? Or am I completely 
> off my rocker this evening.
> 
> Later...
> ...Chuck
> 
Its how for() works:

for( x; y; z) { sentence }

Step 1:  Init in _x_
Step 2:  if _y_ is true preform _sentence_ else stop
Step 3:  do _z_
Step 4:  Go to Step 2

Lets look at Step 3:  i = i->next_in_room
_sentence_ is preformed before _z_ is done, so if i->next_in_room is 
modified inside _sentence_ then you will never get to the next in room,
which can end in a crash or just go on without touching anyone else in
the room. [which was the idea since its an area affected spell]

By doing a 'i = next_i' in _z_ and first in _sentence_ init 'next_i' with
'i->next_in_room' [next_i = i->next_in_room;] then you make sure 
'i->next_in_room' are being kept and transfered to the _z_ part in for()
..
It is slower, but been a common error since the DIKU base code long time
ago.. So if you know i->next_in_room got a chance to be modified, then
do it the 'i = next_i' way.. 


> On Sun, 28 Jul 1996, Niese-Petersen wrote:
> 
> > On Sun, 28 Jul 1996 goamkows@kirk.geog.scarolina.edu wrote:
> > 
> > This is not an answer to the question, but a warning for a common
> > bug....
> > 
> > >     for (i = world[ch->in_room].people; i; i = i->next_in_room)
> >                                                  ^^^^^^^^^^^^^^^
> >                                                         |
> >   This is dangerous. Special since 'i' has a chance for dying.
> > If 'i' die, then 'i->next_in_room' is NULL or something weird, since
> > 'i' is being extracted..
> > 
> >   what to do instead:
> > 
> > Add a struct char_data *next_i;
> > 
> > for (i = world[ch->in_room; i; i = next_i) {
> >   next_i = i->next_in_room;
> > ...etc...
> > 
---
Erik Niese-Petersen
Aka Quint The typo God
Realms of Darkness IMP [matrix.xiii.com 6666. Playertesting]


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



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