不兼容的指针类型 - C.

时间:2016-08-25 06:51:01

标签: c pointers struct

我有这种结构结构,在这段代码中提供:

typedef void* DataP;
typedef struct Table* TableP;
typedef const void* ConstKeyP;

typedef struct DataPointer
{
    DataP dataP;
    ConstKeyP key;
}DataPointer;

typedef struct HashTableSet
{
DataPointer *hashSet[MAX_ROW_ELEMENTS];
}HashTableSet;

typedef struct HashTableSet *HashTable;

typedef struct Table
{
int size, d;
HashTable hashTable;
}Table;

这就是结构。 现在这里是创建哈希表的函数 -

TableP createTable(size_t tableSize)
{
TableP tableP = (TableP)malloc(sizeof(Table));
HashTable table = (HashTable)malloc(sizeof(HashTable));
tableP->d = 1;
tableP->size = tableSize;
nullTable(tableP);
return tableP;
}

其中nullTable是一个函数,我想要为实际集合提供内存并且还给出null初始值:

void nullTable(TableP tableP)
{
HashTable hashTable = tableP->hashTable;
int i = 0;
for(;  i < tableP->size; i++)
{
    int j = 0;
    HashTableSet *hashTableSet = (HashTableSet*)malloc(sizeof(HashTableSet));
    for (; j < MAX_ROW_ELEMENTS ; ++j)
    {

        DataPointer *data = (DataPointer*)malloc(sizeof(HashTableSet));
        hashTableSet->hashSet[j] = data;
    }
    hashTable[i] = *hashTableSet;
    //hashTable->hashSet = *hashTableSet;
    hashTable += sizeof(HashTableSet);

    }
}

第一个问题出现在这里 - 在nullTable的最后一行,我试图&#34;跳跃&#34;我的hashTable指针到下一个设置内存。意思是我已经分配了我需要的所有空间,指向我的hashTable [i],然后我将sizeof(HashTableSet)添加到hashTable,因为我希望它能够到达下一个&#34; spot&#34;另一个hashTableSet。这已经像我做错了一样充实。

接下来,我想到了解这个指针迭代在这个函数中是如何工作的真正问题:

DataP removeData(TableP table, const void* key)
{
TableP tableP = table;
int cell = table->hfun(key, table->size);
HashTable hashTable = table->hashTable;
HashTableSet *setPtr = hashTable->hashSet;
int i = 0;
int j = 0;
int d = 1;
while(d < tableP->d)
{
    for (; i < MAX_ROW_ELEMENTS; i++)
    {
        if (table->fcomp(setPtr->hashSet[i]->key, key) == 0)
        {
            DataP dataP = setPtr->hashSet[i]->dataP;
            setPtr->hashSet[i] = NULL;
            table->freeKey((void*)key);
            return dataP;
        }
    }
    setPtr *= 2;
    i = 0;
}
return NULL;
}

我希望setPtr指向我表的第一个HashTableSet。但我收到此错误消息:

 warning: initialization from incompatible pointer type
 HashTableSet *setPtr = hashTable->hashSet;

我也很难理解如何将setPtr带到下一个hashSet,假设我设法为我的需要正确定义了setPtr。

1 个答案:

答案 0 :(得分:1)

根据您的定义:

typedef void* DataP;
typedef struct Table* TableP;
typedef const void* ConstKeyP;

typedef struct DataPointer
{
    DataP dataP;
    ConstKeyP key;
}DataPointer;

typedef struct HashTableSet
{
DataPointer *hashSet[MAX_ROW_ELEMENTS];
}HashTableSet;

typedef struct HashTableSet *HashTable;

typedef struct Table
{
int size, d;
HashTable hashTable;
}Table;

从你的代码:

HashTable hashTable = tableP->hashTable;
HashTableSet *setPtr = hashTable->hashSet;

类型为hashTable的{​​{1}} HashTable。到现在为止还挺好。 下一行是问题:     HashTableSet * setPtr = hashTable-&gt; hashSet;

struct HashTableSet*不是HashTableSet类型!

这将有效:

hashTable->hashSet
相关问题