0

実際、私はこのコードを書きましたが、動作していません。助けてください。

unsigned short checkCollisionOrFood(unsigned short rowHead,unsigned short colHead)
/*this the functionother then main function where i am changing value of "rowHead",but on checking it remain same*/
{
if(turn==0){
    if(address[colHead]&(1<<((rowHead+1)%8))){
        if(((int)(address[(colHead+7)%8]&(1<<(rowHead+1)%8))
           +(int)(address[colHead]&    (1<<(rowHead+2)%8))
           +(int)(address[(colHead+1)%8]&(1<<(rowHead+1)%8)))>1) return -1;
        else{
            rowHead=(rowHead+1)%8;//this value of rowHead is not getting change.
            return 1;
            } 
        } 
    }

変数「turn」、「rowHead」、「colHead」はグローバル変数です。Daniel Fischer の指示に従ってこのコードを変更すると、

unsigned short checkCollisionOrFood()
{
if(turn==0){
    if(address[colHead]&(1<<((rowHead+1)%8))){
    if(((int)(address[(colHead+7)%8]&(1<<(rowHead+1)%8))
    +(int)(address[colHead]&(1<<(rowHead+2)%8))
    +(int)(address[(colHead+1)%8]&(1<<(rowHead+1)%8)))>1) return -1;
      else{
          rowHead=(rowHead+1)%8;
          return 1;
          } 
          }
}
4

2 に答える 2

4

関数パラメーター

unsigned short checkCollisionOrFood(unsigned short rowHead,unsigned short colHead)

同じ名前のグローバル(実際にはファイルスコープ)変数をシャドウするため、関数内では、渡された引数のコピーのみを変更し、関数の外部には影響しません。この関数では、シャドウされたグローバル変数にアクセスできません (いくつかの体操がなければ)。

グローバル変数のポイントは、それら (およびそれらへのポインター) を引数として渡す必要がないことです。これは、それらがなくてもアクセスできるためです。

于 2013-06-22T20:27:25.533 に答える
1

変数を関数に渡す場合、変数は値で渡されます。つまり、関数には変数の独自のコピーがあり、渡された初期変数を変更せずに変数を操作できます。

グローバル変数の値を変更する場合は、同じ名前のパラメーターまたはローカル変数を使用しないでください。したがって、関数は次のようになります。

unsigned short checkCollisionOrFood();
于 2013-06-22T20:31:55.223 に答える