0

チェスのプログラムでナイトを動かしたいです。このため、main を含むすべての関数の上にこれら 2 つの変数 (currentRowと) を定義しています。currentColumn(これらの変数をすべての関数のグローバル変数として使用したかったため、これを行いました)以下のように。騎士が動くと、その位置が変わるからです。そして、これが次の動きへの入力になります。

私が理解していないのは、デバッグ時に、これらの変数が関数内で変化しているのを見ましたが、関数を終了するとすぐにデフォルト値 (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;
         }
   }
}
4

3 に答える 3

4

int currentRow, int currentColumnは関数パラメーター リストに含まれているため、ローカル変数です。彼らは同じ名前のグローバルなものを隠しています。

于 2013-05-20T20:42:59.740 に答える
3

関数には、関数のパラメーターとして宣言された新しい変数 currentRow および currentColumn があります。グローバル変数を更新する場合は、これらのパラメーターを削除します (関数を呼び出すときにパラメーターを渡さないでください)。グローバル変数が更新されます。

あなたがしているのは、グローバル変数をシャドーイングすることです。適切なコンパイラ警告を有効にすると (コンパイラによって異なります)、このエラーについて通知されます。

gcc を使用している場合は、-Wall -Werror でコンパイルしてみてください。

于 2013-05-20T20:44:42.807 に答える
2

関数がローカル コピーを変更しています。それらを関数に渡すと、それらは値で渡され、関数はローカル コピーを作成し、ローカル スコープがグローバル スコープをオーバーライドします。グローバル変数を参照したい場合は、それらを関数に渡さず、そこからアクセスしてください。

于 2013-05-20T20:44:05.380 に答える