2011-08-17 3 views
0

によって渡された構造体へのポインタを、変更します。関数の中で、私は他のボード構造体へのポインタを参照することによって、ボードのサイズを変更しています。 MoveSuccが呼び出される 'PlayBoard.c'の 'theBoard'が変更されますか?は、私は「PlayBoard.c」と呼ばれるファイルにこのコールを持っている参照

EDIT:ユーザーが「X」または「Oを配置しようとしたとき、私が追加した関連機能

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; 
} 

あなたが見ることができるように:putBoardSquareは、別のソースファイルに

EDITを定義しています'ボードの外では、expandBoard()とputBoardSquare()で新しいボードのサイズを印刷したため、拡張する必要があります。しかし、 'PlayBoard.c'のポインタはとにかく変更されていないようです....

私の質問:別の関数に引数として渡された構造体のポインタを変更するにはどうすればよいですか? 'PlayBoard.c'では、引数として1つの構造体を渡します。また、putBoardSquareが別の構造体にrefrenceするようにします。これはPlayBoard.cでも有効です。

私はクリアですか?

+1

より関連性の高いコードを入力してください。この質問は、現在の形で簡単には答えられません。 –

+0

私は誤った質問に答えたので私の答えを削除しましたが、ポインタが更新されないという問題は、theBoardのポインタへのポインタが必要なためです(BoardPが単純なポインタだと仮定します)。 – Makis

+0

もっと詳しく説明できますか?ポインタへのポインタは何が必要ですか? 私は、関数の引数としてポインタを渡すと、それも関数の外で有効になると思っていました。 – yotamoo

答えて

2

EDIT

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); 
    /* ... */ 
} 

(おそらくあなたが持っているコードを投稿する必要があります)、しかし、あなたが持っているエラーは、定義するだけで原因です:あなたはのように、間接の1つのレベルを追加する必要がありますの構造体は利用できませんPlayBoard.c

struct foo { int a; ... } 

に、あなたは、構造体のメンバにアクセスすることができなくなりますようたとえば、あなただけ(「不透明タイプ」を参照してください、可能なのfooの定義なし

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

を持っている場合)。

+0

しかし、expandBoardはポインタを返すので、あなたが提供したことはできません。 – yotamoo

+0

@yot私はあなたの異議を理解していません。あなたはできませんか?私が見る限り、 'expandBoard'では何も変更する必要はありません。 – Artefacto

0

私が正しく理解していて、ボードがどこにポイントしているのかを変更したいのであれば、ポインターではなくポインターへのポインターとして定義する必要があります。

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

とputBoardSquare(でパラメータを変更する)に**、あなたがポインタを設定* theBoard = xでのようにそれを行います。 (xはポインタであると仮定します)。

関連する問題