C - 结构 |结构/联合的类型不完整错误



我目前正在尝试基于哈希表构建字典。逻辑是:有一个名为 HashTable 的结构,其中包含以下内容:

HashFunc HashFunc;
PrintFunc PrintEntry;
CompareFunc CompareWords;
GetKeyFunc GetEntryKey;
DestroyFunc DestoryEntry;

这些是指向函数的指针(用户创建以制作模块化字典)。

_HashArray* HashArray;
int TableSize;

HashArray 是一个由 _HashArray 个对象组成的数组 ->每个对象都是链表的第一个元素。TableSize 是 HashArray 的大小(我们能够创建的哈希值的数量)。

哈希.h:

typedef enum {FAIL = 0, SUCCESS} Result;
typedef enum {SAME = 0, DIFFERENT} CompResult;
typedef struct _Hash *pHash;
typedef void* pElement;
typedef void* pKey;
typedef int (*HashFunc) (pKey key, int size);
typedef Result (*PrintFunc) (pElement element);
typedef CompResult (*CompareFunc) (pKey key1, pKey key2);
typedef pKey (*GetKeyFunc) (pElement element);
typedef void (*DestroyFunc)(pElement element);

哈希.c

typedef struct _List
{
    pElement _Element;
    struct _List* listNext;
} pList;
typedef struct
{
    pList* listFirst;
} _HashArray;
typedef struct
{
    _HashArray* HashArray;
    HashFunc HashFunc;
    PrintFunc PrintEntry;
    CompareFunc CompareWords;
    GetKeyFunc GetEntryKey;
    DestroyFunc DestoryEntry;
    int TableSize;
} _Hash;

我正在尝试减速:

pHash HashCreate(int ArraySize, void* HashWord, void* PrintEntry, void* CompareWords, void* GetEntryKey, void* DestroyEntry)
{
        // First set all function pointers
        // Create the hashtable
    pHash newTable = (pHash)malloc(sizeof(_Hash));
    newTable->HashArray = (_HashArray*)malloc(sizeof(_HashArray)*ArraySize);
    newTable->TableSize = ArraySize;
    newTable->HashFunc = HashWord;
    newTable->PrintEntry = PrintEntry;
    newTable->CompareWords = CompareWords;
    newTable->GetEntryKey = GetEntryKey;
    newTable->DestroyEntry = DestroyEntry;
}

所有新表>都显示错误。

每个结构定义都需要一个名称。看看你对_List的定义:

typedef struct _List {
    pElement _Element;
    struct _List* listNext;
} pList;

以上相当于:

struct _List {
    pElement _Element;
    struct _List* listNext;
}
typedef struct _List pList;

对于所有结构/类型定义,应始终遵循上述格式之一。_Hash 和 _HashArray 的 typdef 指的是未命名的结构。

typedef struct HashArray_struct_name_goes_here
{
    pList* listFirst;
} _HashArray;
typedef struct Hash_struct_name_goes_here
{
    _HashArray* HashArray;
    HashFunc HashFunc;
    PrintFunc PrintEntry;
    CompareFunc CompareWords;
    GetKeyFunc GetEntryKey;
    DestroyFunc DestoryEntry;
    int TableSize;
} _Hash;

您的pHash声明

引用了不存在的类型struct _Hash

更改此设置:

typedef struct
{
    _HashArray* HashArray;
    HashFunc HashFunc;
    PrintFunc PrintEntry;
    CompareFunc CompareWords;
    GetKeyFunc GetEntryKey;
    DestroyFunc DestoryEntry;
    int TableSize;
} _Hash;

对此:

typedef struct _Hash
{
    _HashArray* HashArray;
    HashFunc HashFunc;
    PrintFunc PrintEntry;
    CompareFunc CompareWords;
    GetKeyFunc GetEntryKey;
    DestroyFunc DestoryEntry;
    int TableSize;
} _Hash;

原始声明创建一个匿名结构,并将其typedef为_Hash但没有创建struct _Hash因此pHash的原始typedef仍然不完整。

然后你会遇到一个问题,_Hash没有DestroyEntry成员(你在struct中有一个错别字。

为了使问题更清晰,请阅读以下内容:

typedef struct _Hash *pHash;

如:

#define pHash struct _Hash *

你会看到你的结构定义同样变成了

#define _Hash struct { ... }

哪个不命名结构。因此,您的程序中没有struct _Hash这样的东西。

随着我的改变,它变成了

#define _Hash struct _Hash { ... }

相关内容

  • 没有找到相关文章

最新更新