#c #pointers #integer #return
#c #указатели #целое число #Возврат
Вопрос:
Функция ожидает указатель, но я хочу вернуть целое число в поиске функции (я не могу изменить возвращаемый тип функции), что я могу сделать, чтобы решить эту проблему?
int hashtable_insert(HashTable ** ptable, void *data, void (*delete) (void *))
{
if(hashtable_lookup(*ptable, data) != -1){
return -1;
}
data = malloc(sizeof(size_t));
list_append((*ptable)->list, data, (*ptable)->size);
_hashtable_resize(ptable);
return 0;
}
предупреждение: сравнение между указателем и целым
числом, если (hashtable_lookup(* ptable, data)!= -1){
void * hashtable_lookup(HashTable * table, void *data)
{
for(int i = 0; i < (table)->length; i ){
if((table)->list[i] == data){
return data;
}
}
return -1;
}
предупреждение: возврат создает указатель из целого числа без приведения [-Win-conversion]
возвращает -1;
Ответ №1:
Функция ожидает указатель, но я хочу вернуть целое число в поиске функции (я не могу изменить возвращаемый тип функции), что я могу сделать, чтобы решить эту проблему?
Если функция возвращает void *
, и вы не можете это изменить, то возврат целого числа просто не является вариантом. Вы могли бы вернуть целое число, преобразованное в указатель (и сравнить возвращаемое значение с аналогичным значением), но если ваша хэш-таблица не поддерживает значения null, нулевой указатель создаст лучший код сбоя:
void * hashtable_lookup(HashTable * table, void *data) {
// look up data ...
// lookup failed
return NULL;
}
// ...
if (hashtable_lookup(*ptable, data) != NULL) {
// data is already present in the hash table
return -1;
}
Но если нулевой указатель будет действительными данными для таблицы, тогда
void * hashtable_lookup(HashTable * table, void *data) {
// look up data ...
// lookup failed
return (void *) -1;
}
// ...
if (hashtable_lookup(*ptable, data) != (void *) -1) {
// data is already present in the hash table
return -1;
}
Ответ №2:
Первое предупреждение связано с тем, что вы сравниваете a void*
с an int
. Вторая причина заключается в том, что вы возвращаете int
вместо указателя.
Вы могли бы добавлять приведения здесь и там, чтобы удалить предупреждения ( if(hashtable_lookup(*ptable, data) != (void*)(-1)){
и return (void*)(-1);
, но это было бы сложнее читать и более подвержено ошибкам, поскольку вы обычно проверяете указатели, чтобы они не были нулевыми, но не отличались от «-1».
Обычно вы возвращаете нулевой указатель, чтобы указать, что функция завершилась с ошибкой. Кроме того, вы можете if(hashtable_lookup(*ptable, data) != -1){
ошибаться, поскольку похоже, что когда функция hasthable_lookup() возвращает -1, это не удалось.
Я думаю, это то, что вы ищете.
int hashtable_insert(HashTable ** ptable, void *data, void (*delete) (void *))
{
if(hashtable_lookup(*ptable, data) == NULL){
return -1;
}
data = malloc(sizeof(size_t));
list_append((*ptable)->list, data, (*ptable)->size);
_hashtable_resize(ptable);
return 0;
}
void * hashtable_lookup(HashTable * table, void *data)
{
for(int i = 0; i < (table)->length; i ){
if((table)->list[i] == data){
return data;
}
}
return NULL;
}