Получение символа из 2d указателя на массив символов это свойство указателя структуры в C - PullRequest
0 голосов
/ 02 ноября 2018

Хорошо, так что это немного странно, и, возможно, есть лучший способ решения этой проблемы, но я здесь.

Я пишу игру на линкоре на C для моего вступления в класс CS. В настоящее время у меня есть структура, которая выглядит следующим образом:

typedef struct player {
    char *board[10][10];
    char *map[10][10];
    char *name;
    int kills;
    int deadShips;
    int scorePoints;
    int kdr;
    int hits;
    int misses;

}Player;

и 2 функции:

void printBoard(char board[10][10]) {
    char rowLetters[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};


    printf("    1  2  3  4  5  6  7  8  9  10  \n");

    // Rows
    for (int r = 0; r < NUMROWS; ++r) {
        printf(" %c ", rowLetters[r]);

        // Columns
        for (int c = 0; c < NUMCOLS; ++c) {
            printf(" %c ", board[r][c]);
        }

        printf("\n");
    }
}

void printChar(Player *p) {

    printBoard(*(p->board));

    printf("Choice: '%c'\n", *(p->board)[3][4]);

}

printBoard берет массив и распечатывает его. printChar это часть моей функции, которая не работает. Прямо сейчас я просто хочу получить доступ к одному персонажу доски. После того, как я смогу это сделать, я могу начать проверять, есть ли в этом месте корабль, и соответственно корректировать счет, здоровье корабля и т. Д.

Я предположил, что, поскольку p является указателем на структуру, и эта структура имеет указатель на массив, я мог бы использовать (*(*p->board))[row][col] чтобы добраться до персонажа, которого я хочу. Тем более что передача *(p->board) в printBoard работает просто отлично. Но получение одного конкретного индекса не работает. Так что, в принципе, мне нужно добраться до лягушки, которая находится на поверхности, на бревне. Есть ли синтаксис, чтобы помочь мне с этим? Или даже лучший способ структурирования моей программы? Я немного новичок в указателях, и если есть лучший способ, я полностью открыт для него.

1 Ответ

0 голосов
/ 02 ноября 2018

Я слегка озадачен вашим заявлением о char *board[10][10];, и, возможно, это ваша проблема.

Этот оператор объявляет массив указателей 10x10 на char, обычно рассматриваемый как массив строковых указателей 10x10. Вам нужно выделить память для цели каждого из этих 100 указателей, что я не вижу, чтобы вы делали.

Возможно, вы хотите char [10][10], который является фиксированным массивом 10x10 одиночных символов. Похоже, именно так вы и используете, на мой взгляд.

@ tadman предполагает, что ограничение использования объявленного 2D-массива состоит в том, что вы не можете сделать код динамическим - вы не можете изменить внутреннее измерение, за исключением, возможно, использования меньшего числа и игнорирования более высоких индексов.

Если вы объявите одномерный массив или выделите его с помощью malloc и напишите свой собственный код, который скажет cell=row*width+height, тогда у вас будет больше гибкости.

Если честно, такого рода улучшения проще писать с использованием C ++, а не C, и, возможно, именно здесь вы захотите порезать одежду и ограничить дизайн.

...