C编译器错误“;预期。。。在……之前”;和无效的类型参数

C编译器错误“;预期。。。在……之前”;和无效的类型参数,c,compiler-errors,hashtable,C,Compiler Errors,Hashtable,这是我的第一个C程序,它做了一些有用的事情。我正在实现一个通用哈希表,它可以接受任何类型的键和项。但我遇到了一些不知道如何修复的错误: hash.h:32:错误:应为“=”,“,”,“;”,”“hash_create”之前的asm'或'属性。 hash.h:38:error:expected')在“hash_func”之前 编辑: 在将struct hash\u t类型化为hash之后,我收到了大量这样的错误。 hash.c:12:错误:'->'的类型参数无效(具有'hash') \ifndef

这是我的第一个C程序,它做了一些有用的事情。我正在实现一个通用哈希表,它可以接受任何类型的键和项。但我遇到了一些不知道如何修复的错误:
hash.h:32:错误:应为“=”,“,”,“;”,”“hash_create”之前的asm'或'属性
hash.h:38:error:expected')在“hash_func”之前 编辑: 在将struct hash\u t类型化为hash之后,我收到了大量这样的错误。
hash.c:12:错误:'->'的类型参数无效(具有'hash')

\ifndef\u HASH\u H
#定义散列
/*抽象哈希表的定义*/
typedef void*键;
typedef void*项;
typedef void*散列函数;
typedef void*比较函数;
结构对{
键k;
项目一;
};
结构散列{
整数大小;
int max_大小;
int数组[16];
hash_func hf;
比较函数cf;
};
typedef int boolean_t;
#ifndef FALSE
#定义FALSE 0
#定义真(!假)
#endif//FALSE
/*
*创建并返回一个新的哈希表。
*失败时返回null,否则返回有效的哈希表。
*/
extern hash_t hash_create();
/*
*如果哈希为空,则将哈希函数设置为新值。
*如果设置成功,则返回true;如果未更改,则返回false。
*/
外部布尔哈希集(哈希、哈希函数);
/*设置用于比较值的函数。
*如果设置成功,则返回true;如果未更改,则返回false。
*/
外部布尔哈希比较(哈希、哈希函数);
/*
*如果哈希表为空,则返回TRUE。否则就错了。
*/
外部布尔值\u t hash\u为空(hash\u t h);
/*
*返回表中的元素数。
*/
外部整数散列大小(散列大小);
/*
*将键和值对添加到哈希表中。
*/
外部无效哈希添加(哈希h,对p);
/*
*返回与给定密钥关联的密钥对。
*/
外部对哈希查找(哈希h,密钥k);
/*
*如果键存在,则返回true,否则返回false。
*/
外部布尔值哈希值存在(哈希值h,键k);
/*
*删除与给定密钥关联的密钥对。
*如果成功删除,则返回true,否则返回false。
*/
外部布尔值散列删除(散列h,键k);
#endif/\u HASH\u H
如果您想查看hash.c以及上一个hash.h:
extern struct hash_t hash_create();

/*实现哈希抽象数据类型。*/
#include assert.h>//无法在post中包含<,否则它将消失
#include stdio.h>//不能在post中包含<,否则它将消失
#include stdlib.h>//不能在post中包含<,否则它将消失
#包括“hash.h”
散列
hash_create()
{
hash_t h=(hash_t)malloc(sizeof(struct hash_t));
h->size=0;
}
布尔值
散列集(散列,散列函数){
如果(!hash_为空)
返回FALSE;
其他的
hf=pf;
返回TRUE;
}
布尔值
散列集(散列,散列函数){
如果(!hash_为空)
返回FALSE;
其他的
cf=pf;
返回TRUE;
}
布尔值
哈希值为空(哈希值){
返回h->size==0;
}
int
散列大小(散列大小){
返回h->size;
}
无效的
哈希加法(哈希h,对p){
int i=h->hash\u func(最大大小,p->key);
如果(h->数组[i]!=NULL)
i++;
h->数组[i]=p;
h->size++;
如果(h->size>.75*h->maxsize){
h->最大尺寸*=2;
int arr[h->max_size];
int*temp=h->array;
h->array=arr;
int i=0;
对于(i;imax_size/2;i++){
如果(温度[i]!=NULL)
hash_add(h,temp[i]);
}
}
一对
哈希查找(哈希h,键k){
int i=h->hash\u func(最大大小,k);
而(h->array[i]!=NULL&&h->compare_func(h->array[i]->key,k)!=0){
i++;
}
返回h->数组[i];
}
布尔值
哈希值存在(哈希值h,键k){
返回(hash_查找(h,k)!=NULL);
}
布尔值
散列删除(散列h,键k){
对p=哈希_查找(h,k);
if(p==NULL)
返回FALSE;
其他的
*p=零;
返回TRUE;
}

既然你在写C你需要做:

typedef struct hash_t {
    int size;
    int max_size;
    int array[16];
    hash_func hf;
    compare_func cf;
} hash;

extern hash hash_create();
hash\u t
不是类型-
struct hash\u t
是。这适用于您使用
hash\u t
的所有其他位置-改用
struct hash\u t

或者:


听起来不错!做typedef结构哈希{int size;int max_size;int数组[16];hash_func hf;compare_func cf;}怎么样hash_t;即,交换hash_t和hash,这样我现有的代码就可以工作了。我想出于某种原因,这是一种糟糕的风格?另外,我在帖子中添加了另一个相关错误。现在第一个错误已经修复。
typedef struct hash_t {
    int size;
    int max_size;
    int array[16];
    hash_func hf;
    compare_func cf;
} hash;

extern hash hash_create();