2013-05-20 51 views
0

我想在國際象棋程序中移動騎士。由於這個原因,我有這兩個變量(currentRowcurrentColumn)定義在包括main在內的所有函數之上。 (我這樣做是因爲我想把這些變量作爲所有函數的全局變量),如下所示。因爲騎士移動時,其位置將會改變。這將成爲其下一步行動的投入。爲什麼退出該函數後該變量值返回到默認值?

我不明白的是當我調試時,我看到這些變量在函數中發生了變化,但一旦它退出函數,它們就會返回到默認值(3和4)。

你能告訴我如何解決這個問題嗎?在此先感謝...

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int currentRow=3; 
int currentColumn=4; 

int main(void){ 

... 
} 

int checkIsEmptyandMoveAccordingly(int moveNumber, int currentRow, int currentColumn){ 

    if (chessBoard[currentRow+vertical[moveNumber]][currentColumn+horizontal[moveNumber]]==0 && currentRow+vertical[moveNumber]>=0 && currentColumn+horizontal[moveNumber] >=0 ){ //if empty,move to new location 

     currentRow+=vertical[moveNumber]; 
     currentColumn+=horizontal[moveNumber]; 
     printf("Move randomised to: %d\n", moveNumber); 
     printf("Knight has moved to chessBoard[%d][%d].\n",currentRow,currentColumn); 
     count++; 
     printf("Move count is %d.\n",count); 
     chessBoard[currentRow][currentColumn]=1; 
     if(!checkIsAroundFUll()){ 
      moveNumber=randomiseMovement(); 
      return moveNumber; 
     } 
     else { 
       printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!\n"); 
       return -1; 
     } 
    } 

    else if (chessBoard[currentRow+vertical[moveNumber]][currentColumn+horizontal[moveNumber]]==1) {                                     //if not empty, randomise again 

     printf("Knight CAN NOT MOVE! Target SPACE IS OCCUPIED\n"); 
     if(!checkIsAroundFUll()){ 
      moveNumber=randomiseMovement(); 
      return moveNumber; 
     } 
     else { 
       printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!"); 
       return -1; 
     } 

    } 

    else { 
     printf("OUT OF BOUNDS!! CAN NOT MOVE. TRYING ANOTHER MOVEMENT"); 
     if(!checkIsAroundFUll()){ 
      moveNumber=randomiseMovement(); 
      return moveNumber; 
     } 
     else { 
       printf("ALL TARGET SPACES ARE VISITED BEFORE. KNIGHT CAN NOT MOVE\n PROGRAM WILL BE TERMINATED!!!"); 

       return -1; 
     } 
    } 
} 
+1

因爲你有參數在你的函數中使用全局變量的同名 –

+1

提示:當你有一個名爲checkIsEmptyandMoveAccordingly的函數時,很可能這實際上是兩個僞裝成一個函數:checkIsEmpty和' move'。 – Elazar

回答

4

int currentRow, int currentColumn是在函數參數列表中,所以它們是本地變量。他們隱藏了全球名稱相同的名稱。

2

您的功能正在改變本地副本。當您將它們傳遞給函數時,它們按值傳遞,函數創建本地副本,並且本地範圍覆蓋全局範圍。如果你想引用全局變量,不要將它們傳遞給你的函數,只需從那裏訪問它們。

3

您的函數將新變量currentRow和currentColumn聲明爲函數的參數。如果您想更新全局變量,請刪除這些參數(並且在調用函數時不要傳遞它們),並且您應該看到全局變量更新。

你在做什麼是陰影全局變量。如果啓用了正確的編譯器警告(因編譯器而異),您將被告知有關此錯誤。

如果您使用的是gcc,請嘗試使用-Wall -Werror進行編譯。

相關問題