2016-06-13 52 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に「不完全な型」を持つことと関係していると思います。ほとんどのグーグルは、RCBのサイズをコンパイラが知っていないため、これが原因であることを示しています。これは、この構造体の定義をヘッダに配置する必要があることを示しているようです。これは絶対に必要ですか?

+0

'typedef struct RCB RCB;'それを削除しようとしました –

+0

これを削除すると、この関数で異なるエラーが発生します。 –

答えて

2

最初のステートメントでは、RCBstructであると宣言しており、typedefを使用しています。その後すぐに、「ところで、RCBstruct RCBを意味しますが、この時点では定義されていません。関連のエラーを取り除くでしょうtypedef struct RCB RCB;を削除し、基本的に


を(それが存在するためには、代わりにstruct 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 { 
.... 

structunionに来て)Cで「タグ」名前空間には、識別子の名前空間と異なっています。また、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; 
} 

エラーを修正するには、データ構造とコンパイルを使用する上記のようなコードに変更する必要があります。

関連する問題