2014-01-18 3 views
1

Я относительно новый C. И я написал следующий код:предупреждения в указателе присваивающего

#include "HashTable.h" 

hashTable* newHashTable() 
{ 
    hashTable* h = malloc(sizeof(hashTable)); 
    h -> size = TABLE_SIZE; 
    h -> table = createTable(TABLE_SIZE); 
    return h; 
} 

entry* createTable(int size) 
{ 
    entry* table = malloc(sizeof(entry) * size); 
    int i; 
    for(i=0; i<size; i++) 
     (table + i) -> word = NULL; 
    return table; 
} 

и содержание HashTable.h является:

#include <stdio.h> 
#include <string.h> 
#include <malloc.h> 
#define TABLE_SIZE 7 
#define HASH_INCREMENT 3 // for efficient utilization of the hash table keep TABLE_SIZE * 2^n relative prime to HASH_INCREMENT 
typedef struct entry_t 
{ 
    char* word; 
    int frequency; 
}entry; 
typedef struct hashTable_t 
{ 
    int size; 
    entry* table; 
}hashTable; 

Когда я пытаюсь скомпилировать этот код (с каким-то другим кодом тоже) я получаю следующее предупреждение:

HashTable.c: In function ‘newHashTable’: 
HashTable.c:7:13: warning: assignment makes pointer from integer without a cast [enabled by default] 

линия 7 является на самом деле третьей строкой в ​​функции newHashTable(). Я смотрел на это часами. Пожалуйста, помогите мне разрешить это предупреждение.

ответ

4

Ansii C предполагает, что любая функция, которая вызывается без объявления, возвращается int.

Вы должны либо объявить createTable перед тем newHashTable

entry* createTable(int size); 

hashTable* newHashTable() 
{ 
    /* implementation */ 
} 

entry* createTable(int size) 
{ 
    /* implementation */ 
} 

или переместить его реализацию перед вызовом

entry* createTable(int size) 
{ 
    /* implementation */ 
} 

hashTable* newHashTable() 
{ 
    /* implementation */ 
} 

или объявить функции в заголовке, который также определяет-структуру

typedef struct entry_t 
{ 
    char* word; 
    int frequency; 
}entry; 
typedef struct hashTable_t 
{ 
    int size; 
    entry* table; 
}hashTable; 

entry* createTable(int size); 
hashTable* newHashTable(); 
+0

Спасибо. Это сделал трюк. Но почему? Это мой большой вопрос. – HZero

+0

Третье решение - лучшее. Когда C сначала встречает функцию, она предполагает, что функция возвращает 'int', если первая встреча не является объявлением. В первый раз, когда он видит 'createTable', вы используете его, чтобы присвоить его возвращаемое значение' h-> table'. В то время компилятор считает, что правая сторона возвращает 'int' (по умолчанию), что нехорошо поместить в указатель. И поэтому он жалуется. С помощью этих решений компилятор «знает», что RHS вернет правильный указатель; поэтому предупреждение уходит. – Floris

+0

@UthpalaHerath Посмотрите на первую строку моего ответа. Объявление каждой функции должно появляться перед кодом, который его вызывает. – simonc

Смежные вопросы