2016-10-16 40 views
0

我試圖實現一個哈希表。我得到了上面的錯誤,但AFAIK我已經正確地聲明瞭所有的結構體/ typedefs。 (我仍然在學習C,對不起) 錯誤發生在我的while循環中的test.c中,我把//錯誤。怎麼了?「取消引用指向不完整類型的指針」,typedefs可以

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_ */ 
+0

在'test.c'有numbuckets'的'沒有明顯的界定。您需要將'mlist.c'中的結構定義移動到標題中 –

回答

1

當時您嘗試訪問ml->numbucketsmain,所有它知道的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_ */ 
1

有什麼不對?

您可以使用ml->numbuckets僅當MList完整定義是在該行可見。

由於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); 
} 

,然後調用me_hash_listmain

while ((m2 = me_get(fPtr)) != NULL) { 
    unsigned long int hash = me_hash_list(m2, ml); 
    i++; 
} 
相關問題