2014-11-23 86 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