要求成员'a'不是结构或联合

时间:2014-01-21 23:12:51

标签: c arrays struct function-pointers

我查看了之前关于该主题的帖子无济于事。我试图以不正确的方式访问array中的struct并收到错误request for member ‘Days’ in something not a structure or union

.c中的相关行:

    bool isConflict(TimeSpan *timeA, TimeSpan *timeB, Class *classA[], Class *classB[])
    {       // Checking that days themselves conflict
        int i;
        for (i = 0; i < 7; i++) {
                if ((classA->Days[i] == classB->Days[i]) && (classA->Days[i] != 0)){
                         doStuff;
    }

错误本身正在我尝试访问Days[]的方式发生在这个底线。 Days本身就是我的.h中的原型,prototype s:

    // TimeSpan is a previously created struct that is functioning correctly
    typedef struct Class
    {       TimeSpan timeSpan;
            int Days[7];
    } Class;

    bool isConflict(TimeSpan * a, TimeSpan * b, Class * classA[], Class * classB[]);

最后,我的司机电话看起来像:

    if(isConflict(&EE315.timeSpan, &EE367.timeSpan, &EE315.Days[7], &EE367.Days[7])) 

提前感谢您的帮助! - 艾伦


编辑:感谢包括Floris和ooga在内的所有人帮助我。你的两个提示都被发现了,我很感激。 - 艾伦

2 个答案:

答案 0 :(得分:2)

您正在使用

进行通话
if(isConflict(&EE315.timeSpan, &EE367.timeSpan, &EE315.Days[7], &EE367.Days[7])) 

所以你的第三个论点是

&EE315.Days[7]

是指向数组Days的元素7的指针。你想要的是

&EE315

这是指向你的结构的指针...所以调用变为

if(isConflict(&EE315.timeSpan, &EE367.timeSpan, &EE315, &EE367)) 

看看它是否适合你。

另请注意,您将自己的功能声明为

bool isConflict(TimeSpan * a, TimeSpan * b, Class * classA[], Class * classB[]);

您可能想要使用

bool isConflict(TimeSpan * a, TimeSpan * b, Class * classA, Class * classB);

因为你指的是一个元素,而不是一个元素数组(我认为)。

<强>事后

更改代码可能更容易,如下所示:

bool isConflict( Class *a, Class *b ) {
  int i;
  for (i = 0; i < 7; i++) {
    if ((a->Days[i] == b->Days[i]) && (a->Days[i] != 0)){
      doStuff;
    }
}

由于timeSpanDays[]实际上都是同一结构的一部分。从代码可读性的角度来看,它要好得多。然后你用

来调用它
if(isConflict(&EE315, &EE367)) 

看看有多整洁?

答案 1 :(得分:1)

我认为你的意思是拥有这个原型:

bool isConflict(TimeSpan * a, TimeSpan * b, int daysA[], int daysB[]);

并将其称为:

if(isConflict(&EE315.timeSpan, &EE367.timeSpan, &EE315.Days, &EE367.Days)) 

显然,您必须更改函数的定义才能访问新参数类型。