2016-06-13 323 views
1

我试图采用RRhead,在RRhead上有一个新的RCB点,因为它是下一个,并且在新的RCB处有RRhead点,因为它是先前的点。C结构体的不完整类型

typedef struct{ 
    int sequence_number; 
    int file_descriptor; 
    FILE *requested_file; 
    int bytes_remaining; 
    int quantum; 
    struct RCB *next; 
    struct RCB *prior; 
} RCB; 

typedef struct RCB RCB; 


RCB *RRhead = NULL; 


static void admit_to_scheduler_RR(int fd, FILE *fin){ 
int sequence_counter, new_bytes_remaining, new_quantum = 0; 
    RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL}; 
    RRhead->prior = &new_rcb; 
    RRhead = &new_rcb; 
    sequence_counter++; 
} 

产生以下错误:

sws.c: In function ‘admit_to_scheduler_RR’: 
sws.c:318:10: error: variable ‘new_rcb’ has initializer but incomplete type 
    struct RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL}; 
     ^
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:10: warning: excess elements in struct initializer [enabled by default] 
sws.c:318:10: warning: (near initialization for ‘new_rcb’) [enabled by default] 
sws.c:318:14: error: storage size of ‘new_rcb’ isn’t known 
    struct RCB new_rcb = {sequence_counter, fd, fin, new_bytes_remaining, new_quantum, RRhead, NULL}; 
      ^
sws.c:319:9: error: dereferencing pointer to incomplete type 
    RRhead->prior = &new_rcb; 
     ^

我不知道为什么我收到了多余的元素警告线索。我没有正确初始化new_rcb吗?我是否需要创建它,然后将所有字段设置为我想要的?

我相信这一切都与new_rcb有一个“不完整的类型”有关。大多数使用Google表示这是因为编译器不知道RCB的大小应该是多少。它似乎表明我需要将此结构定义放入一个标题中。这是绝对必要的吗?

+0

'typedef struct RCB RCB;'尝试删除该文件 –

+0

删除该文件会导致此函数发生不同的错误。 –

回答

2

在第一个声明中,您声明RCBstruct使用typedef。直接后来,你说,'顺便说一句,RCB意味着struct RCB',这是没有定义在这一点! (对于存在的,你不得不说struct RCB { ... };代替。)


基本上,删除typedef struct RCB RCB;这将摆脱对相关错误的,但新会弹出。

1

尝试你的结构更改为以下(即删除typedef关键字):

struct RCB { 
    int sequence_number; 
    int file_descriptor; 
    FILE *requested_file; 
    int bytes_remaining; 
    int quantum; 
    struct RCB *next; 
    struct RCB *prior; 
}; 

的更多信息可以在这个答案读给Difference between 'struct' and 'typedef struct' in C++?

1

尝试这样:

typedef struct RCB RCB; 
strutc RCB { 
.... 

“标签”命名空间中的C(与structunion推出)是从标识符名字空间不同。使用typedef,您还可以将标识符RCB与类型struct RCB关联。

0
#include <stdio.h> 
#include <stdlib.h> 

typedef struct RCB RCB; 

typedef struct RCB { 
    int sequence_number; 
    int file_descriptor; 
    FILE *requested_file; 
    int bytes_remaining; 
    int quantum; 
    RCB *next; 
    RCB *prior; 
} RCB; 

RCB new_rcb = {11, 21, NULL, 31, 41, NULL, NULL};; 

static void admit_to_scheduler_RR(int fd, FILE *fin) { 

    int sequence_counter = 0; 
    int new_bytes_remaining, new_quantum = 0; 
    RCB *RRhead = &new_rcb; 
    RRhead->prior = &new_rcb; 
    sequence_counter++; 
} 

int main(int argc, char *argv[]) { 

    admit_to_scheduler_RR(1, NULL); 
    return 0; 
} 

要修复你的错误,你需要更改您的代码类似于上面的东西,它使用你的数据结构和编译。

相关问题