我浏览了之前有关该主题的帖子,但无济于事。我试图以不正确的方式访问 struct
中的 array
,并收到错误request for member 'Days' in some 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 进行原型(prototype)化:
// 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 在内的所有人帮助我。你的两个建议都很正确,我很感激。 - 艾伦
最佳答案
您正在调用电话
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;
}
}
因为 timeSpan
和 Days[]
实际上是同一结构的一部分。从代码可读性的角度来看,它要好得多。然后你用
if(isConflict(&EE315, &EE367))
看看这整洁多了?
关于c - 请求非结构或 union 中的成员 ‘a’,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21271023/