2016-07-10 10 views
0

私は単語を取り、そのアナグラムを見つけて、与えられた辞書ファイルからアナグラムのリストを返すアナグラムプログラムを作っています。私は、ハッシュマップのリンクされたリストと、ハッシュマップの各ノードのリスト(私の割り当てに従って)を使用しています。私はC言語にはかなり新しいので、メモリとポインタに関して多くの問題を抱えています。関数がポインタを返すときに、なぜ "初期化は整数からポインタを作る"のですか?

私はコンパイル時に私が取得しています一般的なエラーのいくつか: 警告:初期化は、キャスト リストなし整数からポインタになります* PLIST = getListFromMap(キー); これはわかりませんが、pListはリストポインタで、getListFromMapはリストポインタを返しています。

getListFromMapため

競合型() リスト* getListFromMap(INTキー){getListFromMapの

前delcarationはここ 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); 
} 
+1

、あなたが持っていることを確認し、少なくとも機能のいずれかを使用中の前に現れる関数のプロトタイプあなたのコード。 – Dmitri

+1

getListFromMapが返された後のfree()の呼び出しは決して実行されません。これはおそらく良いことです。常に何かを返すとは限らないという事実は良いことではありません。 –

+0

この質問の多くの、多くの*出現の1つは[ここに** **見ることができます**](https://stackoverflow.com/questions/13314049/warning-initialization-makes-pointer-from-integer-without-キャスト)。 – WhozCraig

答えて

3

理由は、ポインタを返す関数にもかかわらず、ややあいまいです。根本的なケースは、関数にはプロトタイプはありませんが、それは全体の話ではありません。 C99より前の規則によれば、前方宣言のない関数を呼び出すことはできましたが、コンパイラはすべてのパラメータがdefault type promotionsで、戻り値の型がintであると仮定する必要があります。コンパイラはpListHead = getListFromMap(key)呼び出しを見たとき、それは関数がintを返すことを前提としている理由

。この問題を回避するためには、右typedef秒後、ファイルの先頭に前方宣言を追加します。手始めに

list *getListFromMap(int key); 
+0

働いてくれてありがとう男!以前の宣言を試してみたところ、私はgetListFromMap(int key)をやっていました。明らかに間違っています。 –

関連する問題