2012-09-14 61 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;