0

このコードを書きましたが、コンパイル時に次のステートメントに対して「無効な式」というメッセージが表示されます

unsigned short address[] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};/*array is being   initialized here.no problem uptil here.*/
unsigned short rowHead=3;
unsigned short colHead=0;
unsigned short rowTail =0;
unsigned short colTail =0;
unsigned short foodx;
unsigned short foody;
unsigned short turn=0;
void gameOver()
{
unsigned short i=0;
address[] ={0b10000001,0b01000010,0b00100100,0b00011000,
            0b00011000,0b00100100,0b01000010,0b10000001};
/*this is the line where compiler complaints as invalid expression.*/
while(1)
    {
    PORTD &=~(1<<i);
    PORTB =address[i];
    delay_ms(5);
    PORTD |=1<<i;
    i%8;
    }
}
4

3 に答える 3

0

関数内でgameOver()、単一の割り当てで配列のすべての値を割り当てようとしています。これは合法ではありません。通常、memcpy()またはループを使用して値を 1 つずつ設定します。これは多くの場合、一時配列を宣言して初期化し、その内容を再初期化する配列にコピーすることによって行われます。

一時配列からコピーする場合は、その配列に書き込むつもりはなく、コードを実行するたびに再初期化する必要がないことをコンパイラに通知するために、その配列を作成して にすることをお勧めしますstaticconstそのようです:

static const unsigned short tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 };
memcpy(address, tmp, sizeof(address));

ただし、宛先変数の名前は少し疑わしいです。通常、何かが呼び出された場合address、それはポインターであると予想されます。それがポインターであることを意味し、指す値を変更するつもりがない場合address、割り当てはほぼ合法です。

unsigned short const *address;
/* ... */
static const unsigned short tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 };
address = tmp;

consttmp[]を作成する (および constaddressへのポインターを作成する) と、コンパイラーはデータを読み取り専用セグメントに入れることができます。これは、組み込みシステムの ROM を意味する場合があります。

質問に示されていないコードに隠れた複雑さがあり、これによりaddressへのポインターを作成できないconst場合、事態は複雑になります。ポインターに変更addressし、ポインターが指すものを変更すると、予期しない結果が生じる可能性があります。

ただし、示されているコードはコピーする必要があるようには見えず、charすべての値を保持するために要素が a よりも大きくない必要があります。一時配列は、同じように簡単に作業配列にすることができます。

void gameOver()
{
    unsigned short i=0;
    static const unsigned char tmp[] = { 0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81 };

    while(1)
    {
        PORTD &=~(1<<i);
        PORTB = tmp[i];
        delay_ms(5);
        PORTD |=1<<i;
        i%8;  /* <-- this has no effect, I think you meant i=(i+1)%8; */
    }
}
于 2013-06-22T19:02:12.083 に答える