2012-09-14 215 views
0

我從我的編譯器得到一個錯誤如下:指向結構的指針成員

C51編譯器V9.01 - SN:C1ADC-HAI60D版權KEIL ELEKTRONIK GMBH 1987年至2009年 *警告C260 LINE IN 300 SEQUENCE.C作者: '=':指針截斷 * ERROR C190 IN線301 SEQUENCE.C作者: '&':不是左值

以下是我的代碼:

struct myCond{ 
    unsigned char currStatus; 
    unsigned char prevStatus; 
    unsigned int *timer; 
    unsigned char *flag; 
    } 
    struct myCond StatCond; 

    unsigned int data timerdata; 
    bit bdata timeflag; 

    void someSubroutine (void) 
    { 
    struct myCond *tempCond; 

tempCond = &StatCond; 
tempCond->timer = &((unsigned int)timerdata); 
tempCond->flag = &((unsigned char)timeflag); 
    } 
+1

你在結構聲明後忘了';'。我認爲這不是唯一的改正,但是你的類型聲明很奇怪。 –

+0

以下哪條線是300線? 301是哪個? – Jens

回答

1
unsigned int data timerdata; // what is 'data', is it defined? 
bit bdata timerflag; // what are 'bit' and 'bdata', are they defined? 

請檢查您的代碼以瞭解上述問題。編譯器錯誤通常會在真實進攻後多行報告。

+1

'bdata'和'data'數據類型由Keil定義:[here](http://www.keil.com/support/man/docs/c51/c51_le_bdata.htm) – gaganbm

3

我們應該猜測哪條線是301?

的問題,據我瞭解在這裏:

tempCond->timer = &((unsigned int)timerdata); 
tempCond->flag = &((unsigned char)timeflag); 

(unsigned int)timerdata(unsigned char)timeflag是價值觀,r-values要精確。與l-values不同,它們不能被修改或分配,其中timerdatatimeflag是和timeflag。所以你不能把地址r-values&。這將與編寫&1相同。它本身不存在作爲數據存儲器中的對象。

而應該寫:

tempCond->timer = &timerdata; 
tempCond->flag = (unsigned char*)&timeflag; 

而且我不是很肯定,這是合法的取位變量的地址。最後一行可能無法編譯。

或許重新定義結構將有助於:

struct myCond{ 
... 
    bit bdata *flag; // or maybe without bdata 
    } 

,然後你會寫tempCond->flag = &timeflag;