У меня есть структура и двумерная антенная решетка тех структур:
typedef struct {
char exit_n;
char exit_s;
char exit_w;
char exit_e;
} room;
room map[MAP_WIDTH][MAP_HEIGHT];
Мне нужен массив указателей те структуры. Следующие компиляции кода, но я не получаю требуемый результат. Какая-либо справка? Это становится действительно перепутанным мне, любое объяснение ценилось бы
room *rooms;
rooms = (room*)malloc(sizeof(room*) * ROOM_NUM);
[..]
rooms[n] = map[room_x][room_y];
[..]
Вообще-то, я думаю, что ты хочешь
room** rooms;
rooms = (room**)malloc(sizeof(room*) * ROOM_NUM);
[..]
rooms[n] = &map[room_x][room_y];
Это дает тебе массу указателей на твои комнаты.
Я уверен, что вы хотите
sizeof(room)
Вы должны выделить достаточно места для структуры. Вы выделяете только для указателя.
Вам также может понадобиться распределить по-другому, если вам нужен двухмерный массив: смотрите здесь динамическое выделение массивов в C
Основная проблема, которую я вижу, заключается в том, что вы используете sizeof(room*)
. Это означает, что вы берете размер указателя на структуру, а это не то, что вам нужно. Вы хотите распределить размер структуры, поэтому сделайте sizeof(room)
. Также используйте calloc
в данном случае, а не malloc
, так как вы в основном реализуете функциональность первой, умножая количество комнат на размер комнаты.
В вашем текущем коде room
становится массивом структур room
, а не массивом указателей. Если вам нужен массив указателей, каждый из которых указывает на ваш массив map
, то вам нужен другой слой:
room** rooms = malloc(ROOM_NUM * sizeof *rooms);
// ...
rooms[n] = &map[room_x][room_y];
(Или вы можете использовать sizeof (room *)
, как в вашем коде вместо sizeof *room
; я предпочитаю писать его таким образом, чтобы избежать дублирования информации о типах)
Необходимо выделить место для указателей и для номеров , а затем инициализировать указатели, чтобы они указывали на номера.
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];
Если я правильно понимаю, вы хотите, чтобы массив указателей на все значения комнаты
в карте
. Так как есть MAP_WIDTH*MAP_HEIGHT
такие значения, нам нужно столько указателей:
room *rooms[MAP_WIDTH*MAP_HEIGHT];
Вышеуказанное декларирует room
как массив указателей.
Теперь, чтобы присвоить значения:
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];
Мы в основном находим адрес каждого элемента в карте
и сохраняем его в правильной записи в комнатах
.
Это то, что вы хотели?