Изменение указателя на структуру, переданную по ссылке - PullRequest
0 голосов
/ 17 августа 2011

У меня есть этот вызов для файла с именем 'PlayBoard.c':

MoveSucc = putBoardSquare(theBoard, getX, getY, nextTurn);

Где 'theBoard' - указатель на структуру Board. Внутри функции я изменяю размер платы, ссылаясь на указатель на ДРУГУЮ структуру доски, более крупную. Изменит ли он «theBoard» на «PlayBoard.c», где вызывается MoveSucc?

РЕДАКТИРОВАТЬ: putBoardSquare определен в другом исходном файле

РЕДАКТИРОВАТЬ: я добавил соответствующие функции

Boolean putBoardSquare(BoardP theBoard, int X, int Y, char val)
{
    if (val != 'X' && val != 'O')
    {
        reportError(BAD_VAL);
        return FALSE;
    }

    if (X<0 || Y<0)
    {
        reportError(OUT_OF_BOUND);
        return FALSE;
    }

    if (X>theBoard->height || Y>theBoard->width)
    {
        theBoard = expandBoard(theBoard, X,Y);
    }

    printf("BOARD SIZE IS %d*%d\n",theBoard->height,theBoard->width);

    if (theBoard->board[X][Y] == 'X' || theBoard->board[X][Y] == 'Y' )
    {
        reportError(SQUARE_FULL);
        return FALSE;
    }

    if (val != turn)
    {
        reportError(WRONG_TURN);
        return FALSE;
    }

    theBoard->board[X][Y] = val;
    printf("PUT %c\n",theBoard->board[X][Y]);
    changeTurn(val);

    return TRUE;
}

static BoardP expandBoard(ConstBoardP theBoard, int X, int Y)
{
    int newWidth = theBoard->width;
    int newHeight = theBoard->height;
    if (X>theBoard->height)
    {
        newHeight = (newHeight+1) * 2;
    }

    if (Y>theBoard->width)
    {
        newWidth = (newWidth+1) * 2;
    }

    BoardP newBoard = createNewBoard(newWidth,newHeight);
    copyBoard(theBoard,newBoard);
    printf("RETUNRNING NEW BOARD OF SIZE %d*%d\n",newHeight,newWidth);
    return newBoard;
}

Как вы можете видеть, когда пользователь пытается поместить 'X' или 'O' за пределы доски, его нужно развернуть, что происходит (я знаю, потому что я напечатал новый размер платы в expandBoard () и в putBoardSquare ()). Но указатель в PlayBoard.c, похоже, все равно не меняется ....

Мой вопрос: как я могу изменить указатель структуры, передаваемой в качестве аргумента другой функции? В «PlayBoard.c» я передаю одну структуру в качестве аргумента и хочу, чтобы putBoardSquare ссылался на нее в другой структуре, которая также будет действовать в PlayBoard.c.

Я ясно?

Ответы [ 2 ]

2 голосов
/ 17 августа 2011

РЕДАКТИРОВАТЬ

theBoard = expandBoard(theBoard, X,Y);

Это назначение изменяет только локальную переменную.Вам нужно будет добавить один уровень косвенности, например:

MoveSucc = putBoardSquare(&theBoard, getX, getY, nextTurn);

Boolean putBoardSquare(BoardP *theBoard, int X, int Y, char val)
{
    /* ... */
    *theBoard = expandBoard(theBoard, X,Y);
    /* ... */
}

Ваш вопрос сбивает с толку (возможно, вам следует опубликовать код, который у вас есть), но ошибка, которую вы получаете, вызвана простоопределение структуры недоступно в PlayBoard.c.Например, если у вас есть только

struct foo;
void foo(struct foo *foov) { ... }

без определения foo, как в

struct foo { int a; ... }

, вы не сможете получить доступ к членам структуры (см."непрозрачный тип").

0 голосов
/ 17 августа 2011

Если я правильно понимаю, и вы хотите изменить, куда указывает theBoard, вам нужно определить его как указатель на указатель, а не как указатель.

MoveSucc = putBoardSquare(&theBoard, getX, getY, nextTurn);

и измените параметр в putBoardSquare() на **, и когда вы установите указатель, сделайте это следующим образом (при условии, что x - указатель):

*theBoard = x;

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