2013-06-22 111 views
0

我寫了這個代碼,但在編譯我得到的消息「無效的表達式」 以下聲明如何初始化c中的數組?

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; 
    } 
} 
+0

C不支持'0b'作爲二進制數的前綴。或者任何其他的基地,真的。 – unwind

+0

你說什麼基地?我知道C支持這個基礎:「0x」= 16位,「0」= 8位, –

+0

是啊0b以及0x都在工作 – shafeeq

回答

8

你只能做那個聲明,並在同一時間爲變量賦值時。事後你不能這樣做。你可以創建另一個變量並將其賦值,雖然:

unsigned short address2[] = { 0b10000001,0b01000010,0b00100100,0b00011000, 
           0b00011000,0b00100100,0b01000010,0b10000001 }; 
address = address2; 

可能使問題sizeof(address)之後;如果你需要使用另一個變量可能會更好。

+0

錯誤...請問,在這種情況下如何聲明'address'?至於OP中的聲明,這是行不通的。 – alk

+0

'地址'應該是我可以看到並知道的'unsigned short *'。雖然我沒有嘗試編譯代碼。 – Joey

+0

Ahok,很好......謝謝 - 雖然這可能是一個好主意,但從OP中並不明顯。 – alk

0

如果你想一次過分配整個數組(而不只是得到它的引用),你可以把它包裝成一個struct這樣的:

#include <stdlib.h> 
#include <stdio.h> 

#define ADDRESS_DEF {1, 2, 3} 

typedef struct 
{ 
    unsigned short _[sizeof((int[]) ADDRESS_DEF)/sizeof(*((int[]) ADDRESS_DEF))]; 
} address_t; 

address_t address_def = {ADDRESS_DEF}; 

int main() 
{ 
    address_t address = address_def; 

    size_t size = sizeof(address._)/sizeof(*address._); 

    for (size_t s = 0; s < size; ++s) 
    printf("address #%zd = %uh\n", s, address._[s]); 


    address = (address_t) {{4, 5, 6}}; 

    for (size_t s = 0; s < size; ++s) 
    printf("address #%zd = %uh\n", s, address._[s]); 

    return 0; 
} 
0

gameOver()功能,你試圖用一個賦值來分配一個數組的所有值。這不合法。您通常會使用memcpy()或循環來逐個設置值。這通常是通過聲明和初始化一個臨時數組並將其內容複製到要重新初始化的數組中來完成的。

如果您從臨時數組中複製,最好的做法是使其編號爲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; 

製作tmp[]常量(及其製備address一個指向常數)允許編譯器將數據放在一個只讀段,這可能意味着在嵌入式系統上的ROM。

如果您的代碼存在一些隱藏的複雜性,但未在問題中顯示,並且這會阻止您將address指向const,則事情會變得複雜。如果您將address更改爲指針並繼續修改指向的內容,則可能會產生意想不到的後果。

但是,顯示的代碼看起來不像需要複製,並且元素不得大於char以保存所有值。臨時陣列可能與工作陣列一樣容易:

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; */ 
    } 
}