我正在创建一个anagram程序,它接受一个单词并找到它的字谜然后返回给定字典文件中的字谜列表。我使用链表作为哈希映射和哈希映射的每个节点的列表(根据我的分配)。我对C很新,所以我在内存和指针方面遇到了很多问题。
编译时遇到的一些常见错误: 警告:初始化使得指针来自整数而没有强制转换 list * pList = getListFromMap(key); 我不明白这个,pList是一个列表指针,getListFromMap返回一个列表指针。
getListFromMap()的冲突类型 list * getListFromMap(int key){
以前对getListFromMap的删除就在这里 getListFromMap(键); 我读了一些有关前方声明的内容虽然我不确定这是如何工作的,但我在尝试时遇到了错误。
typedef struct list {
char *word;
struct list *next;
} list;
typedef struct hashmap {
list *words;
int key;
struct hashmap *next;
} hashmap;
hashmap *pMapHead;
hashmap *pMapCurr;
list *pListHead;
list *pListCurrd;
int sum = 0; // sum of words
int hCount = 0;
void addWordsToMap(int key, list *words) { // create hashmap
hashmap *pHash = pMapHead;
pMapCurr = pHash;
while (pMapCurr) {
pMapCurr = pMapCurr->next;
}
pMapCurr->words = words;
pMapCurr->key = key;
pMapCurr->next = NULL;
hCount += 1;
}
list *addWord(int key) {
pListHead = getListFromMap(key);
pListCurr = pListHead;
while (pListCurr) {
pListCurr = pListCurr->next;
}
pList->word = word;
pList->next = NULL;
pCurr->next = pList;
pCurr = pList;
return pListHead;
}
list *getListFromMap(int key) {
hashmap *map = pMapHead;
pMapCurr = map;
while (pMapCurr != NULL) {
if (pMapCurr->key == key) {
return pMapCurr->words;
free(map);
}
pMapCurr = pMapCurr->next;
}
}
int getSum(char* word) {
int sum = 0;
int i = 0;
while (word[i]) {
word[i] = toupper(word[i]);
sum += word[i] - '@';
i++;
}
return sum;
}
void loadWords() {
FILE* dict = fopen("/home/akw54/Desktop/CS283/akw54-cs283- summer2016/A1/dict", "r");
if (dict == NULL) {
return;
}
pListHead = (list *) malloc(sizeof(pListHead));
pListCurr = pListHead;
pMapHead = (hashmap *) malloc(sizeof(pMapHead));
pMapCurr = pMapHead;
int key = 0;
list wordList;
char word[128];
while(fgets(word, sizeof(word), dict) != NULL) {
key = getSum(word);
addWordsToMap(key, addWord(key));
}
free(dict);
}
void main() {
loadWords();
free(pMapHead);
free(pMapCurr);
free(pListHead);
free(pListCurr);
}
答案 0 :(得分:3)
你得到"初始化的原因是指针来自整数"警告,尽管函数返回一个指针,有点模糊。根本情况是函数没有原型,但这不是整个故事。根据C99之前的规则,您被允许调用没有前向声明的函数,但编译器必须假定所有参数都受default type promotions的约束,并且返回类型也是int
。
这就是为什么当编译器看到pListHead = getListFromMap(key)
调用时,它会假定函数返回int
。为了避免这个问题,请在typedef
s之后的文件顶部添加一个前向声明:
list *getListFromMap(int key);