これは、メインと関数「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は私にそれから抜け出すことを提案します。