Проблемы с указателями и целыми числами в C

#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;
}