【问题标题】:Error: request for member 'y' in something not a structure or union错误:在不是结构或联合的情况下请求成员“y”
【发布时间】: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


【解决方案1】:

由于结构指针,您需要-&gt; 而不是.,并在它之前删除*

应该是

int xx = dotyk->x;
int yy = dotyk->y;

【讨论】:

    【解决方案2】:

    Jayesh 的回答是正确的,但为了澄清一些事情,我认为重要的是你要知道你的代码和他的回答之间的区别。

    您的问题是您假设 * 运算符的优先级高于 "."。这是错误的假设。

    如果你输入 (*dotyk).y 它会像 -> 一样正常工作。

    "->" 只是 (*something).member 的快捷方式。

    【讨论】:

      【解决方案3】:

      变量dotyk 是一个Coordinate(它是一个结构的typedef)指针。 现在,当您尝试访问变量变量(该结构中的变量)时,您这样做了:

      int yy = *dotyk.y;
      

      问题在于,由于数学运算符的执行顺序各不相同(例如,*/+ 和 `- 之前),因此 C 运算符中存在顺序。

      在 C 中,.* 之前,所以你实际上是在指针 ITSELF (dotyk) 的地址中调用变量 y,而不是它指向的地址(结构)。

      有两种解决方案:

      1. 使用括号。

        int yy = *dotyk.y; 转向

        int yy = (*dotyk).y; 这样您就会提到您希望首先执行运算符 *,以便 Y 变量请求将对指针的内容(它指向的位置)执行,而不是指针本身。

      2. 使用-&gt; 运算符。

      -&gt; 运算符在结构指针方面非常有用。

      不要写int yy = *dotyk.y;,而是写int yy = dotyk-&gt;y;,这样会说“嘿,我希望你把dotyk当作一个指针,把我带到可以找到它所在的Y变量指向”。

      希望我有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多