Как настроить заполнение массива с помощью memset - PullRequest
1 голос
/ 28 марта 2019

У меня есть структура Player, которая содержит GameBoard, который представляет собой двумерный массив символов.

Когда я использую memset, он не устанавливает массив

Я попытался использовать адрес доски (&, *) и без этих символов

Я могу заставить его работать, если я использую указатель на переменную Player в 'initializeBoard', но назначение говорит не использовать указатель

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>

const int ROWS = 10;
const int COLS = 10;

const char *PLAYERONE = "Player 1";
const char *PLAYERTWO = "Player 2";
const char WATER = '~';
const int NUM_SHIPS = 5;

typedef struct gameBoard {
    char board[ROWS][COLS];
} GameBoard;

typedef struct human {
    char name[20];
    GameBoard gameBoard;
} Player;

// function prototypes

void displayGameBoard(Player player);
void initializeBoard(Player player);
void initializePlayer(Player *player, const char *name);






// main function
int main() {
    Player playerOne;
    Player playerTwo;
    // call function welcomeScreen

    initializePlayer(&playerOne, PLAYERONE);
    // end program
    return 0;
}

void displayGameBoard(Player player) {
    int row;
    int col;
    printf("%s's Game Board\n", player.name);
    printf("---------------------------------------------\n");
    printf("|   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |\n");
    printf("---------------------------------------------\n");
    for (row = 0; row < ROWS; row++) {
        printf("| %d |", row);
        for (col = 0; col < COLS; col++) {
            printf(" %c |", player.gameBoard.board[row][col]);
        }
        printf("\n");
    }
    printf("---------------------------------------------");
}

void initializeBoard(Player player) {
    memset(*player.gameBoard.board, WATER, sizeof(player.gameBoard.board));
}

void initializePlayer(Player *player, const char *name) {
    char playerName[20];
    GameBoard playerBoard;
    strcpy(player->name, playerName);
    player->gameBoard = playerBoard;
    initializeBoard(*player);
    displayGameBoard(*player);
}

Я ожидаю, что результат будет заполнен символом '~', но он либо повреждает весь терминал, либо печатает пробелы

Ответы [ 2 ]

3 голосов
/ 28 марта 2019

Здесь:

void initializeBoard(Player player) {
    memset(*player.gameBoard.board, WATER, sizeof(player.gameBoard.board));
}

Вы передаете объект Player копией, а не ссылкой.Объект, который вы устанавливаете, не является объектом, который вы намереваетесь установить, и в любом случае является временным.Передача больших структур в стеке также неэффективна (в этом случае вы можете пересмотреть сигнатуру displayGameBoard()).Кроме того, член board не нуждается в разыменовании.

void initializeBoard(Player* player);

...

void initializeBoard(Player* player) 
{
    memset( player->gameBoard.board, WATER, sizeof(player->gameBoard.board));
}

Затем вызовите его в initializePlayer(), таким образом:

initializeBoard(player);
3 голосов
/ 28 марта 2019

Проблема в том, что вы передаете свою структуру игрока по значению здесь:

initializeBoard(*player);

так что вы работаете над копией . Передайте указатель и поработайте над исходной структурой так:

initializeBoard(player);

и измените функцию initializeBoard на такую:

void initializeBoard(Player *player) {
   memset(player->gameBoard.board, WATER, sizeof(player->gameBoard.board)); 
}

тогда все должно работать как положено. Вам также следует изменить функцию displayBoard(), потому что нет необходимости передавать по значению, и это требует гораздо больших вычислительных усилий (скопируйте всю структуру)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...