User Name:



Forgot your password?
AFKMud 2.2.3
Author: AFKMud Team
Submitted by: Samson
Author: Various
Submitted by: Samson
Author: Various
Submitted by: Samson
SmaugFUSS 1.9.4
Author: Various
Submitted by: Samson
SmaugFUSS 1.9.3
Author: Various
Submitted by: Samson
Users Online
CommonCrawl, SemrushBot, AhrefsBot, Sogou

Members: 0
Guests: 5
Newest Member

Today's Birthdays
There are no member birthdays today.
» SmaugMuds » Codebases » SWR FUSS » Issue with space v2
Forum Rules | Mark all | Recent Posts

Issue with space v2
< Newer Topic :: Older Topic >

Pages:<< prev 1 next >>
Post is unread #1 May 18, 2010 6:36 am   
Go to the top of the page
Go to the bottom of the page

JoinedJun 9, 2009

I decided to incorporate this into my mud a few days ago and finally got through all the compiler errors. One thing I noticed though was that there were no parts for the ships actually created. They were all in the prototype files that came with the source as samples. So I decided to create a parts creation command. This is where I'm having the problem.

I have it set up to do a couple of things but any time I try to do something with the parts name other than set it, the mud crashes when strlen is called. This happens any time I try to display it or save it and I can not figure out why.

Here's some relevant bits and pieces of code to show what I'm doing so someone can hopefully figure out what I'm doing wrong.

The part_data structure in mud.h:
struct part_data
   PART_DATA * next;
   PART_DATA * prev;
   PAYLOAD_DATA * first_payload;
   PAYLOAD_DATA * last_payload;
   PAYLOAD_DATA * firing;
   TIMER * first_timer;
   TIMER * last_timer;
   char * name;
   int v1;
   int v2;
   int v3;
   int v4;
   int v5;
   int v6;
   int hit;
   int maxhit;
   int cost;
   float size;
   short type;
   short count;
   short fired;
   bool military;

The part_table in ships.cpp:
const unsigned short MAX_SHIP_PARTS(256);
struct part_data part_table[MAX_SHIP_PARTS];

Function to save the part table to file:
void save_part_table()
   FILE *fp;
   char filename[MAX_STRING_LENGTH];

   if ( ( fp = FileOpen( filename, "w" ) ) == NULL )
      perror( filename );
   for( int x = 0; x <= MAX_SHIP_PARTS; ++x )
      fprintf( fp, "#PART\n" );
      fprintf( fp, "Name     %s~\n",   part_table[x].name );     <--- Craps out here
      fprintf( fp, "Hit      %d\n",    part_table[x].hit );
      fprintf( fp, "Maxhit   %d\n",    part_table[x].maxhit );
      fprintf( fp, "Cost     %d\n",    part_table[x].cost );
      fprintf( fp, "Type     %d\n",    part_table[x].type );
      fprintf( fp, "Restrict %d\n",    part_table[x].military );
      fprintf( fp, "Size     %1.1f\n", part_table[x].size );
      fprintf( fp, "V1       %d\n",    part_table[x].v1 );
      fprintf( fp, "V2       %d\n",    part_table[x].v2 );
      fprintf( fp, "V3       %d\n",    part_table[x].v3 );
      fprintf( fp, "V4       %d\n",    part_table[x].v4 );
      fprintf( fp, "V5       %d\n",    part_table[x].v5 );
      fprintf( fp, "V6       %d\n",    part_table[x].v6 );
      fprintf( fp, "#ENDPART\n");
   FileClose( fp );

Piece of the do_editpart function for displaying the parts:
if( !str_cmp(arg, "list") )
   if ( argument[0] == '\0' )
      send_to_char( "Current complete list of parts.\r\n", ch );
      send_to_char("*************************************************************************\r\n", ch );
      for ( short x = 0; x < MAX_SHIP_PARTS; ++x )
         if( part_table[x].name != '\0' )
            ch_printf( ch, "%-3d) Name: %-15s Hit: %-5d Maxhit: %-5d Cost: %-6 Type: %-7s Size: %-1.1f MIL: %c\r\n",
            ( x + 1 ), part_table[x].name, part_table[x].hit, part_table[x].maxhit, part_table[x].cost,
            part_types[part_table[x].type], part_table[x].size, part_table[x].military == true ? 'Y' : 'N' );
      send_to_char("*************************************************************************\r\n", ch );
...there's some more stuff down here under the list option for displaying a list of specific part types, such as shields but it's more
or less exactly the same. And it dies on the call to ch_printf as well :(

And another sectiont of do_editpart for setting a parts name:
if( !str_cmp(arg, "name") )
   if( argument[0] == '\0' )
      send_to_char( "You need to specify a name for your new part.\r\n", ch );
   part_table[part].name = STRALLOC(argument);
   ch_printf( ch, "New part name is %s.\r\n", argument );
Setting the name seems to work just fine.

I've run it through gdb a few times trying to figure out what's going on and it seems to be setting the name just fine. I can print it out in there no problem, but any attempt to do something with it in-game, after the name has been set, and down comes the mud.

So, any ideas?

Post is unread #2 May 19, 2010 6:41 am   
Go to the top of the page
Go to the bottom of the page

JoinedApr 19, 2010

A gdb backtrace of a specific crash might be helpful to start really figuring out
what is going on. From the way you are saying things, it sounds like you are
having crashes in more then one place and it is a bit unclear what data you
give goes with what.

But, strlen can be crashed with a NULL or invalid pointer, so I would think that
would be a clue. Doing a quick look, I see a number of things wrong, some
might cause a crash, and others probably not:
The loop in your save should be < MAX_SHIP_PARTS not <= (might crash).
The ch_printf in the list has %-6 for the cost (missing a d?)( could crash).
Your name set does not STRFREE the old name if one is set (should not crash).

Post is unread #3 May 19, 2010 6:32 pm   
Go to the top of the page
Go to the bottom of the page

JoinedJun 9, 2009

Hmm. Thanks for pointing those things out.

Well now. After taking care of those issues it seems to be working.
Thanks a lot! :)

Pages:<< prev 1 next >>