Я относительно новый 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(). Я смотрел на это часами. Пожалуйста, помогите мне разрешить это предупреждение.
Спасибо. Это сделал трюк. Но почему? Это мой большой вопрос. – HZero
Третье решение - лучшее. Когда C сначала встречает функцию, она предполагает, что функция возвращает 'int', если первая встреча не является объявлением. В первый раз, когда он видит 'createTable', вы используете его, чтобы присвоить его возвращаемое значение' h-> table'. В то время компилятор считает, что правая сторона возвращает 'int' (по умолчанию), что нехорошо поместить в указатель. И поэтому он жалуется. С помощью этих решений компилятор «знает», что RHS вернет правильный указатель; поэтому предупреждение уходит. – Floris
@UthpalaHerath Посмотрите на первую строку моего ответа. Объявление каждой функции должно появляться перед кодом, который его вызывает. – simonc