0

これは、メインと関数「checkCollisionOrFood()」で配列「turn[20]」を初期化するコードです。4 つの値は、turn[0]、turn[1]、turn[2]、turn[3] です。メイン関数でゼロに初期化され、残りは「checkCollisionOrFood()」で初期化されています。これが障害の開始場所です。「checkCollisionOrFood()」でターン[4] = 0を初期化し、どこにでもアクセスすると、0のままになりますどんな機能でも!次のターン[]、つまりターン[5]を初期化すると、ターン[4]の値が枯渇します。つまり、ターン[4]にはガベージ値があります。ターン[20]はグローバル変数であり、そのインデックス「ヘッド」もグローバルです.I 「この問題で立ち往生しています。助けてください。これが私の完全なコードです」

#include <mega8.h>
#include <delay.h>
#include <stdlib.h>

unsigned short address[]=    {0b00001111,0b00000000,0b00000000,0b00000000,
  0b00000000,0b00000000,0b00000000,0b00000000};
unsigned short turn[20];//it is declared as global variable.
unsigned short head=3;
unsigned short colHead=0;
unsigned short rowHead =3;
unsigned short rowTail=0;
unsigned short colTail=0;
unsigned short size=4;
unsigned short foodx;
unsigned short foody;

...

unsigned short checkCollisionOrFood()
{
head=(head+1)%20;
if(turn[head-1]==0){
    turn[head]=0;

/これは、turn[] が初期化される場所です。ここで turn[head] にアクセスすると、つまり iniliazition の直後に正しい値が返されますが、前の値にアクセスすると、turn[head-1] を意味し、ガベージ値が返されます/

    PORTB=255;PORTB&=~(1<<turn[4]);PORTD.7=0;delay_ms(200);PORTD.7=1;

/このステートメントにより、ターン[4]の初期化直後にターン[4]の値をチェックして正しい答えを出し、ターン[5]の初期化とターン[4]へのアクセス後にゴミが発生します。/

    rowHead=(rowHead+1)%8;
    if(!(address[colHead]&(1<<rowHead)))return 1;
    else if((address[colHead]&(1<<rowHead))&&
    (!((colHead==foody)&&(rowHead==foodx))))gameOver();
    else return 0;
    }
if(turn[head-1]==1){
    turn[head]=1;
    colHead=(colHead+1)%8;
    if(!(address[colHead]&(1<<rowHead)))return 1;
    else if((address[colHead]&(1<<rowHead))&&
    (!((colHead==foody)&&(rowHead==foodx))))gameOver();
    else return 0;
    }
}
void main(void)
{
turn[0]=0;turn[1]=0;turn[2]=0;turn[3]=0;

/これらの turn[] の値は、アクセス先に関係なく変更されません。/

while (1)
  {
  if(checkCollisionOrFood())
    {
    PORTB=(address[colHead] |=1<<rowHead);
    turnOffTail();
    blink();
    }
  else
    {
    PORTB=address[colHead];
    createFood();
    blink();
    }
  }

}

Plzは私にそれから抜け出すことを提案します。

4

2 に答える 2

0
unsigned short checkCollisionOrFood()
{
    head=(head+1)%20;
    if(turn[head-1]==0){
        turn[head]=0;

"head" が "20" に達すると、問題が発生する可能性があります。「head」の値は 0 に戻ります。これにより、「turn[-1]」の値をテストできます。

于 2013-06-28T06:18:10.673 に答える