Использование структур в C - PullRequest
0 голосов
/ 25 сентября 2018

Привет, я строю простую игру на языке c (я новичок в языке)Я использую следующие структуры:

typedef struct
{
    int adjacent_mines;
    bool revealed;
    bool is_mine;
} Tile;

struct GameState
{
    Tile tiles[NUM_TILES_X][NUM_TILES_Y];
};
typedef struct GameState GameState;

Мне интересно, как правильно вызвать и установить структуры?У меня есть следующий код, где я хотел бы установить состояние каждой плитки.

void intialize_mines(){
    for (int i =0; i < NUM_TILES_X; i++){
        for (int j =0; j < NUM_TILES_Y; j++){
            tiles[i,j].revealed = false;
        }
    }
}

Но согласно выводу моей консоли я сделал это неправильно.Как бы я настроить это правильно?

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

struct GameState просто объявляет тип (так же, как int это просто тип).Вы должны создать реальную структуру в памяти с GameState foo;, похожим на обычную переменную (int foo;).И вы не можете получить доступ к содержимому структуры, не ссылаясь на структуру, как foo.tiles.tiles сам по себе не известен в этой области.

Впоследствии вы можете получить доступ к структуре с помощью foo.tiles[i][j].revealed.

Но чтобы иметь доступ к этой структуре в вашей функции, вы должны либопередайте его функции в качестве указателя или объявите структуру в файловой области (также называемой глобальной).Я бы предпочел, чтобы первая версия была более понятной, например, больше функций.

Ваша функция будет выглядеть так:

void intialize_mines( GameState *foo){
    for (int i =0; i < NUM_TILES_X; i++){
        for (int j =0; j < NUM_TILES_Y; j++){
            foo->tiles[i][j].revealed = false; // -> is a special operator for pointers to structs. It's the same as (*foo).
        }
    }
}

соответствующий вызов функции будет:

GameSate bar;
intialize_mines( GameState &bar);

Вы также должны проверить, как использовать многомерные массивы.Вы объявили это правильно с двумя отдельными [], но в своей функции вы используете [x,y], что неверно в C. Это будет так же, как в объявлении tiles[i][j]

0 голосов
/ 25 сентября 2018

Вы только что пропустили создание структуры GameState.

GameState gs;

void initialize_mines() {
    for (int i =0; i < NUM_TILES_X; i++) {
        for (int j =0; j < NUM_TILES_Y; j++) {
            gs.tiles[i][j].revealed = false;
        }
    }
}
0 голосов
/ 25 сентября 2018

Для многомерного массива, такого как tiles, необходимо указать индекс массива каждого измерения в пределах [] следующим образом:

tiles[i][j].revealed = false;

Это означает, что revealed принадлежит jв столбце i в строке tiles установлено значение false.

И вам придется определить структурную переменную типа GameState перед выполнением каких-либо операций с ней.

GameState initGS;

void intialize_mines(){
    for (int i =0; i < NUM_TILES_X; i++){
        for (int j =0; j < NUM_TILES_Y; j++){
            initGS.tiles[i][j].revealed = false;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...