Я занимаюсь университетским проектом, и меня попросили создать что-то вроде игры между процессами: они должны захватывать некоторые флаги, размещенные над общей матрицей, подобно шахматной доске. Я представлял плату с использованием структуры и ячеек в качестве матрицы, но после выделения сегмента разделяемой памяти я не могу правильно прикрепить ее, потому что при попытке доступа к ячейкам матрицы я получаю «ошибку сегментации», фактически я вижу, что указатель матрицы нуль. Итак, как мне прикрепить матрицу после выделения всей платы?
Вот код функций, которые я написал для выделения / присоединения платы:
int allocate_board(int width, int height){
size_t size;
int shm_id;
key_t shm_key;
char current_path[PATH_MAX];
getcwd(current_path, sizeof(current_path));
shm_key = ftok(current_path, 1);
size = sizeof(board) + ( sizeof(cell) * height * width );
shm_id = shmget(shm_key, size, IPC_CREAT | 0660);
if ( shm_id < 0 ){
printf("Cannot allocate the game board, aborting.\n");
exit(1);
}
return shm_id;
}
board* get_board(int shm_id){
void* shm_ptr;
board* game_board;
shm_ptr = shmat(shm_id, NULL, 0);
if ( (int)shm_ptr == -1 ){
printf("Cannot attach the shared memory segment, aborting.\n");
printf("Reported error: %s.\n", strerror(errno));
exit(2);
}
game_board = (board *)shm_ptr;
return game_board;
}
Вот определение структур:
typedef struct {
entity_type_t entity_type;
owner_id_t owner_id;
float flag_score;
} cell;
typedef struct {
int width;
int height;
sem_t* semaphore;
cell** cells;
} board;
Вот как я пытаюсь получить доступ к ячейкам доски:
game_board->width = some_width;
game_board->height = some_height;
game_board->cells[0][0].flag_score = some_score;