2010-01-07 32 views
6

que tiene una estructura y una matriz bidimensional de esas estructuras:C: matriz dinámica de punteros a la matriz de la estructura

typedef struct { 
char exit_n; 
char exit_s; 
char exit_w; 
char exit_e; 
} room; 

room map[MAP_WIDTH][MAP_HEIGHT]; 

necesito una matriz de punteros esas estructuras. El siguiente código se compila, pero no obtengo el resultado deseado. ¿Alguna ayuda? Esto se está poniendo realmente confundido a mí, ninguna explicación sería apreciada

room *rooms; 
rooms = (room*)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = map[room_x][room_y]; 
[..] 

Respuesta

1

estoy estoy bastante seguro de que quiero

sizeof(room) 

Es necesario asignar suficiente espacio para la estructura. Solo está asignando un puntero.

También puede ser necesario asignar de manera diferente si desea una matriz 2D: ver aquí dynamic allocating array of arrays in C

+1

Por cierto, en este caso particular sizeof (room) == sizeof (room *) en un sistema de 32 bits: D – mingos

+0

@mingos: buen ojo! –

1

El principal problema que veo es que está utilizando sizeof(room*). Esto significa que está tomando el tamaño de un puntero a una estructura, que no es lo que quiere. Desea asignar el tamaño de la estructura, así que haga que sizeof(room). Además, use calloc en este caso, no malloc, ya que básicamente está implementando la funcionalidad del primero multiplicando el número de habitaciones por el tamaño de la habitación.

+0

¿no es como hacer otra serie de _rooms_ donde quiero una matriz de _pointers a room_? – pistacchio

+0

Ah, ya veo lo que quieres decir. Algunas de las otras publicaciones lo han hecho bien. – avpx

1

En su código actual, rooms se convierte en una matriz de estructuras room, no en una matriz de punteros. Si quieres una matriz de punteros que cada punto de la matriz map, necesita otra capa de indirección:

room** rooms = malloc(ROOM_NUM * sizeof *rooms); 
// ... 
rooms[n] = &map[room_x][room_y]; 

(o puede utilizar sizeof (room *) como su código tiene lugar de sizeof *rooms; prefiero escribir de esa manera para evitar la duplicación de información de tipo.)

+0

puede necesitar espacio *** un conjunto 2D de indicadores de habitación –

+1

Me parece que 'rooms' se supone que es una forma alternativa, unidimensional de acceder al' map' en lugar de ser bidimensional. – JaakkoK

+0

No lo creo. Él tiene habitaciones ROOM_NUM. Supongo que ROOM_NUM es igual al producto de las dimensiones del mapa. la habitación *** no funcionaría para una matriz 2D de todos modos. –

9

en realidad, creo que desea

room** rooms; 
rooms = (room**)malloc(sizeof(room*) * ROOM_NUM); 
[..] 
rooms[n] = &map[room_x][room_y]; 

Esto le da una matriz de punteros a sus habitaciones.

0

Debe asignar espacio para los punteros y para las habitaciones y luego inicializar los punteros para apuntar a las salas.

room *rooms; 
room **prooms; 
rooms = (room*)malloc((sizeof(room) + sizeof(room*)) * ROOM_NUM); 
prooms = (room**)(&rooms[ROOM_NUM]); 
for (int ii = 0; ii < ROOM_NUM; ++ii) 
    prooms[ii] = &rooms[ii]; 
0

Si he entendido bien, que desea una matriz de punteros a todos los valores de roommap. Puesto que hay MAP_WIDTH*MAP_HEIGHT tales valores, necesitamos que muchos punteros:

room *rooms[MAP_WIDTH*MAP_HEIGHT]; 

El anterior declara rooms como una matriz de punteros.

Ahora, para asignar los valores:

size_t i; 
size_t j; 

for (i=0; i < MAP_WIDTH; ++i) 
    for (j=0; j < MAP_HEIGHT; ++j) 
     rooms[i*MAP_HEIGHT+j] = &map[i][j]; 

básicamente nos encontramos con la dirección de cada elemento en map, y almacenarlo en la entrada correcta en rooms.

¿Esto es lo que quería?

Cuestiones relacionadas