我对名为'PlayBoard.c'的文件进行了调用:
MoveSucc = putBoardSquare(theBoard, getX, getY, nextTurn);
'theBoard'是指向struct Board的指针。在函数内部,我通过引用指向另一个更大的板结构的指针来改变电路板的尺寸。它会改变调用MoveSucc的'PlayBoard.c'上的'theBoard'吗?
编辑: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中生效。
我清楚了吗?
答案 0 :(得分:2)
修改
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; ... }
然后您将无法访问结构的成员(请参阅“opaque类型”)。
答案 1 :(得分:0)
如果我理解正确并且您想要更改theBoard
指向的位置,则需要将其定义为指针指针,而不是指针。
MoveSucc = putBoardSquare(&theBoard, getX, getY, nextTurn);
并将putBoardSquare()
中的参数更改为**
,并在设置指针时执行(假设x
是指针):
*theBoard = x;