【发布时间】:2014-08-22 09:19:24
【问题描述】:
我的编译有问题。
这是我的主要内容:
int main(void) {
TP_Init();
Coordinate *dotyk;
while( 1 )
{
dotyk = Read_Ads7846();
int xx = *dotyk.x;
int yy = *dotyk.y;
TP_DrawPoint(xx,yy);
}
}
我的函数 Read_Ads 看起来:
Coordinate *Read_Ads7846(void) {
static Coordinate screen;
int m0,m1,m2,TP_X[1],TP_Y[1],temp[3];
uint8_t count=0;
int buffer[2][9]={{0},{0}};
do
{
TP_GetAdXY(TP_X,TP_Y);
buffer[0][count]=TP_X[0];
buffer[1][count]=TP_Y[0];
count++;
}
while(!TP_INT_IN&& count<9);
if(count==9)
{
temp[0]=(buffer[0][0]+buffer[0][1]+buffer[0][2])/3;
temp[1]=(buffer[0][3]+buffer[0][4]+buffer[0][5])/3;
temp[2]=(buffer[0][6]+buffer[0][7]+buffer[0][8])/3;
m0=temp[0]-temp[1];
m1=temp[1]-temp[2];
m2=temp[2]-temp[0];
m0=m0>0?m0:(-m0);
m1=m1>0?m1:(-m1);
m2=m2>0?m2:(-m2);
if( m0>THRESHOLD && m1>THRESHOLD && m2>THRESHOLD )
return 0;
if(m0<m1)
{
if(m2<m0)
screen.x=(temp[0]+temp[2])/2;
else
screen.x=(temp[0]+temp[1])/2;
}
else if(m2<m1)
screen.x=(temp[0]+temp[2])/2;
else
screen.x=(temp[1]+temp[2])/2;
temp[0]=(buffer[1][0]+buffer[1][1]+buffer[1][2])/3;
temp[1]=(buffer[1][3]+buffer[1][4]+buffer[1][5])/3;
temp[2]=(buffer[1][6]+buffer[1][7]+buffer[1][8])/3;
m0=temp[0]-temp[1];
m1=temp[1]-temp[2];
m2=temp[2]-temp[0];
m0=m0>0?m0:(-m0);
m1=m1>0?m1:(-m1);
m2=m2>0?m2:(-m2);
if(m0>THRESHOLD&&m1>THRESHOLD&&m2>THRESHOLD)
return 0;
if(m0<m1)
{
if(m2<m0)
screen.y=(temp[0]+temp[2])/2;
else
screen.y=(temp[0]+temp[1])/2;
}
else if(m2<m1)
screen.y=(temp[0]+temp[2])/2;
else
screen.y=(temp[1]+temp[2])/2;
return &screen;
}
return 0;
}
我得到了错误:
在非结构或联合的情况下请求成员“y”
我认为我需要使用 -> 运算符,但它也会导致错误。
你能解释什么是错的吗?
【问题讨论】:
-
您可能会发现Operator Precedence in C 具有教育意义,尤其是在表格中出现
'*'和'.'的地方。提示:您的'.'优先于您的'*'。 -
有一个大问题,除了不正确地使用operator predence)。也就是说,大多数时候函数 Read_Ads7846() 经常返回 '0' I.E.空值。当 main() 代码尝试取消引用 'null 时,程序将崩溃。因此,返回的指针在使用前必须检查不为空。
-
作为旁注。 C 语言不允许在任何地方定义堆栈变量,只能在“{”之后立即定义,因此您必须使用 C++ 编译器。在 C 中声明堆栈变量的习惯,而不是紧跟在“{”之后的其他地方,会在现实世界中给你带来很多痛苦。
标签: c