"Dereferencing pointer to incomplete type",typedef 没问题
"Dereferencing pointer to incomplete type", typedefs are ok
我正在尝试实现哈希 table。我收到上述错误,但 AFAIK 我已经正确声明了我所有的 structs/typedefs。 (我还在学C,sorry)
错误发生在我的 while 循环中的 test.c 中,我在其中放置了 //ERROR。怎么了?
test.c
#include "mentry.h"
#include "mlist.h"
int main() {
FILE *fPtr = fopen("S.txt", "r");
MList *ml = ml_create();
MEntry *m2;
int i = 1;
while ((m2 = me_get(fPtr)) != NULL) {
unsigned long int hash = me_hash(m2, ml->numbuckets); // ERROR HERE
i++;
}
return 0;
}
mlist.c
#include "mentry.h"
#include "mlist.h"
#define NUMBUCKETS 3
#define BUCKETSIZE 5
typedef struct bucket {
int size; // number of elements in this bucket
MEntry *entries; // array of MEntries
} Bucket;
typedef struct mlist {
int numbuckets; // number of buckets
Bucket **buckets; // an array of Bucket pointers
} MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void) {
MList *ml = malloc(sizeof(MList));
ml->numbuckets = NUMBUCKETS; // random initial number
// will increment once a bucket is full
// init Buckets
int b;
for (b=0; b<ml->numbuckets; b++) {
Bucket *bk = malloc(sizeof(Bucket));
bk->size = 0;
bk->entries = calloc(BUCKETSIZE, sizeof(MEntry));
ml->buckets[b] = bk;
}
return ml;
}
mlist.h
#ifndef _MLIST_H_
#define _MLIST_H_
#include "mentry.h"
typedef struct mlist MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void);
#endif /* _MLIST_H_ */
What's wrong?
仅当 MList
的完整定义在该行可见时,您才可以使用 ml->numbuckets
。
由于 MList
的完整定义仅在 mlist.c 中可见,您只能在该文件中访问 struct
的成员。
一种方法是在 mlist.h:
中声明一个函数
unsigned long int me_hash_list(MEntry* m1, MList* m2);
并在mlist.c中定义为:
unsigned long int me_hash_list(MEntry* m1, MList* m2)
{
return me_hash(m1, m2->numbuckets);
}
然后从 main
.
调用 me_hash_list
while ((m2 = me_get(fPtr)) != NULL) {
unsigned long int hash = me_hash_list(m2, ml);
i++;
}
当您尝试访问 main
中的 ml->numbuckets
时,它所知道的 m1
类型是这样的:
typedef struct mlist MList;
它知道 MList
是一种结构类型,但它对其中的内容一无所知。
你需要把完整的定义放在mlist.h
:
#ifndef _MLIST_H_
#define _MLIST_H_
#include "mentry.h"
typedef struct mlist {
int numbuckets; // number of buckets
Bucket **buckets; // an array of Bucket pointers
} MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void);
#endif /* _MLIST_H_ */
我正在尝试实现哈希 table。我收到上述错误,但 AFAIK 我已经正确声明了我所有的 structs/typedefs。 (我还在学C,sorry) 错误发生在我的 while 循环中的 test.c 中,我在其中放置了 //ERROR。怎么了?
test.c
#include "mentry.h"
#include "mlist.h"
int main() {
FILE *fPtr = fopen("S.txt", "r");
MList *ml = ml_create();
MEntry *m2;
int i = 1;
while ((m2 = me_get(fPtr)) != NULL) {
unsigned long int hash = me_hash(m2, ml->numbuckets); // ERROR HERE
i++;
}
return 0;
}
mlist.c
#include "mentry.h"
#include "mlist.h"
#define NUMBUCKETS 3
#define BUCKETSIZE 5
typedef struct bucket {
int size; // number of elements in this bucket
MEntry *entries; // array of MEntries
} Bucket;
typedef struct mlist {
int numbuckets; // number of buckets
Bucket **buckets; // an array of Bucket pointers
} MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void) {
MList *ml = malloc(sizeof(MList));
ml->numbuckets = NUMBUCKETS; // random initial number
// will increment once a bucket is full
// init Buckets
int b;
for (b=0; b<ml->numbuckets; b++) {
Bucket *bk = malloc(sizeof(Bucket));
bk->size = 0;
bk->entries = calloc(BUCKETSIZE, sizeof(MEntry));
ml->buckets[b] = bk;
}
return ml;
}
mlist.h
#ifndef _MLIST_H_
#define _MLIST_H_
#include "mentry.h"
typedef struct mlist MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void);
#endif /* _MLIST_H_ */
What's wrong?
仅当 MList
的完整定义在该行可见时,您才可以使用 ml->numbuckets
。
由于 MList
的完整定义仅在 mlist.c 中可见,您只能在该文件中访问 struct
的成员。
一种方法是在 mlist.h:
中声明一个函数unsigned long int me_hash_list(MEntry* m1, MList* m2);
并在mlist.c中定义为:
unsigned long int me_hash_list(MEntry* m1, MList* m2)
{
return me_hash(m1, m2->numbuckets);
}
然后从 main
.
me_hash_list
while ((m2 = me_get(fPtr)) != NULL) {
unsigned long int hash = me_hash_list(m2, ml);
i++;
}
当您尝试访问 main
中的 ml->numbuckets
时,它所知道的 m1
类型是这样的:
typedef struct mlist MList;
它知道 MList
是一种结构类型,但它对其中的内容一无所知。
你需要把完整的定义放在mlist.h
:
#ifndef _MLIST_H_
#define _MLIST_H_
#include "mentry.h"
typedef struct mlist {
int numbuckets; // number of buckets
Bucket **buckets; // an array of Bucket pointers
} MList;
/* ml_create - creates a new mailing list
- returns pointer to start of mailing list*/
MList *ml_create(void);
#endif /* _MLIST_H_ */