AREA_DATA **area_list; // an array of pointers to AREA_DATA
area_list = (AREA_DATA **) malloc(sizeof(AREA_DATA*) * count);
// area_list is still valid.
free(area_list);
// area_list is no longer valid
AREA_DATA *area_list[count];
// It specifically works like this in gcc extended C. It straight C you're talking about count needing to be known at compile time. Eg not a variable.
AREA_DATA *get_rand_area( PLANET_DATA *p) {
std::vector<AREA_DATA *> area_list;
for(a = p.list; a; a = a->next_area)
area_list.push_back(a);
return area_list[number_range(0, area_list.size() - 1)];
}
void do_randplanet( CHAR_DATA * ch, char *argument )
{
PLANET_DATA *planet;
AREA_DATA *area;
AREA_DATA *parea;
AREA_DATA **area_list; // an array of pointers to AREA_DATA
int count;
if( (planet = get_planet(argument)) == NULL )
{
send_to_char( "&RNo such planet.\n\r",ch );
return;
}
for( area = planet->first_area; area; area = area->next_on_planet )
count++;
area_list = (AREA_DATA **) malloc(sizeof(AREA_DATA*) * count);
parea = area_list[number_range(0, count-1)];
ch_printf( ch, "Planet: %s Selected Area:%s", planet->name, parea->name );
free(area_list);
return;
}
Wed Jul 1 12:54:40 2009 :: Log Banner: cedit randplanet create
Program received signal SIGSEGV, Segmentation fault.
0x08195677 in do_randplanet (ch=0x8f11ac8, argument=0xbfae9f3b "Coruscant")
at misc.c:5761
5761 parea = area_list[number_range(0, count-1)];
(gdb) print area_list
$1 = (AREA_DATA **) 0x0
(gdb)
This code is supposed to loop through the areas of a planet and find a suitable room and return it, however, for some reason it always seems to settle on one area in the list no matter what. Is there something wrong here?