查看了与此相关的许多其他SO帖子,但没有人能够帮助我。所以,我定义了以下结构:
typedef struct
{
int created;
double data;
int timeLeft;
int destination;
}dataPacket;
typedef struct
{
dataPacket *array;
int currIndex;
int firstIndex;
int nextTick;
int maxLength;
int length;
int stime;
int total;
}packetBuffer;
typedef struct{
int mac;
struct wire *lconnection;
struct wire *rconnection;
int numRecieved;
struct packetBuffer *buffer;
int i;
int backoff;
}node;
typedef struct{
float length;
float speed;
int busy;
struct dataPacket *currPacket;
struct node *lnode;
struct node *rnode;
}wire;
然后我尝试使用以下功能:
int sendPacket(node *n, int tick)
{
if(n->buffer->length > 0)
{
if(n->backoff <= 0)
{
if (n->lconnection->busy != 0 || n->lconnection->busy != 0)
{
n->i++;
n->backoff = (512/W * genrand()*(pow(2,n->i)-1))/TICK_LENGTH;
}
else
{
n->lconnection->busy = 1;
n->rconnection->busy = 1;
n->lconnection->currPacket = n->buffer[n->buffer->currIndex];
n->rconnection->currPacket = n->buffer[n->buffer->currIndex];
}
}
else
{
n->backoff--;
}
}
}
每当我尝试访问缓冲区,lconnection或rconnection的成员时,我都会收到标题中描述的错误。
答案 0 :(得分:5)
struct packetBuffer *buffer;
您已经定义了类型packetBuffer
(其他匿名结构的typedef)。
您尚未定义struct packetBuffer
。
如果没有现有类型struct packetBuffer
,编译器会将其视为不完整类型,假设您稍后将完成它。声明
struct packetBuffer *buffer;
完全合法,但除非buffer
类型可见,否则您无法取消引用struct packetBuffer
。
只需删除struct
关键字。
(我个人倾向于放弃typedef
并始终将结构类型称为struct whatever
,但这是风格和品味的问题。)
答案 1 :(得分:1)
以下内容:
typedef struct {
int x;
char *y;
...
} my_struct;
为匿名结构创建标识符。顺序,对于一个引用自身实例的结构,它不能是“匿名的”:
typedef struct my_struct {
int x;
char *y;
struct my_struct *link
....
} my_struct_t;
这意味着my_struct_t
现在是struct my_struct
类型,而不仅仅是一个匿名结构。另请注意,struct my_struct
可以在其自己的结构定义中使用。匿名结构是不可能的。
作为最终的并发症,my_struct
中的struct my_struct
位于与my_struct_t
不同的“命名空间”中。这有时用于简化(或混淆)代码中的内容:
typedef struct my_struct {
int x;
char *y;
struct my_struct *link
....
} my_struct;
现在,我可以在代码中的任何位置使用my_struct
,而不是struct my_struct
。
最后,您可以将typedef与结构定义分开以实现相同的效果:
struct my_struct {
int x;
char *y;
struct my_struct *link;
....
};
typedef struct my_struct my_struct;
如David R.Hanson的 C接口和实现中所述,“此定义是合法的,因为结构,联合和枚举标记占用的名称空间与变量,函数的空间分开,并输入名称。“