2014-11-23 62 views
0

所以我通過調用一個函數訓練,作爲輸入3打開文件,並返回一個哈希表指針,並在主要分配給hash_table_t hashtablemain()作出哈希表。然而,當我嘗試將​​作爲主指針傳遞給read_query(*hashtable, query)時,我的問題依然存在,因爲我首先沒有將它初始化爲指針。C哈希表指針錯誤

int main() 
{ 
    int size 
    FILE *D1 = fopen(fileLoc, "r"); 
    FILE *D2 = fopen(fileLoc, "r"); 
    FILE *D3 = fopen(fileLoc, "r"); 
    FILE *query = fopen(fileLoc, "w"); 

    ... 
    hash_table_t hashtable = training(D1, D2, D3, size); 

    ... 
    read_query(*hashtable, query); 

} 

hash_table_t training (D1, D2, D3, size) 
{ 
    hash_table_t *hashtable = create_new_hashtable(size); 

    .... 
    return *hashtable; 
} 

所以我的問題是,你怎麼能重鑄,這不是第一次初始化爲指針的結構,因爲只調用主洪水​​我的錯誤控制檯,具體...

c:267:20: error: invalid type argument of unary _*_ (have _hash_table_t_) read_query(*hashtable, query);

+0

函數'training'應該是返回指針。例如'hash_table_t *訓練(D1,D2,D3,size){...返回hashtable;',在主'hash_table_t * hashtable =訓練(D1,D2,D3,size);' – BLUEPIXY 2014-11-23 15:59:04

回答

1

我假設hash_table_t是一個結構類型(而不是指向結構的指針)並且create_new_hashtable在堆上創建了一個散列表,其中malloccalloc

然後,你正在處理整個散列表的指針,這意味着你所有的聲明都是hash_table_t *類型,並且你會在沒有恆星的情況下傳遞hastable變量。您訪問成員hashtable->whatever

hash_table_t *training (FILE *D1, FILE *D2, FILE *D3, int size) 
{ 
    hash_table_t *hashtable = create_new_hashtable(size); 

    ... 
    return hashtable; 
} 

,並調用它是這樣的:

hash_table_t *hashtable = training(D1, D2, D3, size); 

... 
read_query(hashtable, query); 

請注意,您應該training聲明類型的參數。舊C將默認使這些參數爲int,但現代C(從C99開始)禁止默認的int聲明。使用C99。

+0

謝謝, ,我只有一個問題,爲什麼沒有必要在'read_query(hashtable,query)'中調用'* hashtable'? – Sean 2014-11-23 16:14:23

+0

你是什麼意思,打電話?你的意思是解除引用嗎? 'hashtable'是一個指針,你將指針傳遞給散列表。對散列表進行操作的函數通過使用' - >'來訪問成員來解引用它。 (請記住'ht-> x's與'(* ht).x'相同。) – 2014-11-23 16:33:08