From: "Brian" <borlick@MINES.EDU>
> On Tue, 5 Nov 2002, Bill Pascoe wrote:
>
> > I implemented the ferry code on the FTP website it works great
> > (after I fixed the send to room error). But
> > was I happy NO.... I decided it needed more. I wanted it so that when
> > <---snip-->
> > I think you should be able to get the picture. Now what in the world
> > is wrong with this.
> > <---snip-->
>
> Well, this:
>
> > struct obj_data *tobj;
>
> The pointer, tobj, gets reset every time the function is called since it's
> a local variable. You can solve this by making the variable "static".
>
> static struct obj_data *tobj;
>
> This comes with the disadvantage that you can only use the ferry routine
> for one ferry. With multiple ferries, every time a new object was creted,
> it would overwrite the old value of tobj. And if we assume the object
> can't be moved, there's still the problem that the object may get purged
> before the ferry routine is run. In that case, tobj points to memory
> which may longer be valid. That is, you may get random crashes from that
> code.
>
Nope. Have a look at mag_creations(). That's actually the exact way it is
supposed to be.
> If you really wanted to go so far, you could add another member to
> obj_data, a callback function pointer, called when the object is
> destroyed. Then, in your ferry routine, you would set up that callback
> pointer when you create the new object. Then, in extract_obj, call the
> callback function. That function, in turn, would have to update tobj to
> NULL (which means you'd have to make tobj global so callback function
> could access it). But that's overkill.
>
Yep. Since read_object() already adds the object to the object list,
the object is still valid after the function returns. *tobj, however,
is not.
What should be done is something aling these lines:
#define FERRY_VNUM 1220
struct obj_data *tobj;
int found = FALSE;
if(time_info.hours == ferrys[onferrynum].f_time_arrive_to_room2){
<---snip to make shorter--->
if (!tobj = read_object(FERRY_VNUM, VIRTUAL))
log("SYSERR:No ferry object designed!");
else
obj_to_room(tobj, real_room(ferrys[onferrynum].f_to_room));
<---snip to make shorter--->
}
if(time_info.hours == ferrys[onferrynum].f_time_leave_from_room2){
<---snip to make shorter--->
/* search this room for the object */
for (tobj = world[real_room(ferrys[onferrynum].f_to_room)].contents;
tobj && !found; tobj = tobj->next_content)
if (GET_OBJ_VNUM(tobj)==FERRY_VNUM)
found = TRUE;
if (found) {
obj_from_room(tobj);
extract_obj(tobj);
}
<---snip-->
}
> DGScripts may allow you to do this in some fashion, but I've never used
> it.
They do. Easily, even. But it's a big much to implement just to get
a few ferries.
Welcor
--
+---------------------------------------------------------------+
| FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
| Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
| Newbie List: http://groups.yahoo.com/group/circle-newbies/ |
+---------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 06/25/03 PDT