Указатель из целого числа без предупреждения при вызове LFIND
Вопрос
Я пишу вектор в C. Функция Cvectorsearch использует BSEARCH, если он отсортирован, и Lfind, если она несортирована. Почему я получаю предупреждение: «Задание делает указатель из целого числа без состава», когда я звоню Lfind? Кажется, он работает нормально, даже когда используется Lfind.
typedef struct
{
void *elements;
int logicalLength;
int allocatedLength;
int elementSize;
} CVector;
typedef void (*CVectorFreeElemFn)(void *elemAddr);
int CVectorSearch(const CVector *v, const void *key,
CVectorCmpElemFn comparefn,
int startIndex, bool isSorted)
{
void * found;
int elemSize = v->elementSize;
int length = v->logicalLength;
void *startAddress = (char*)v->elements + startIndex*elemSize;
if(isSorted)
found = bsearch(key, startAddress, length, elemSize, comparefn);
else
found = lfind(key, startAddress, &length, elemSize, comparefn);
if(found)
return ((char*)found - (char*)v->elements) / elemSize;
else
return -1;
}
редактировать: Теперь, когда я включил Search.h я получаю:
warning: passing argument 3 of 'lfind' from incompatible pointer type
Программа все еще работает правильно, хотя.
Решение
Третий аргумент Lfind () - это указатель на size_t
нет int
Как вы проходите. А size_t
тип может быть другой, чем int
на некоторых архитектурах (особенно X86-64), и это также не подписывается. Вы должны изменить тип length
переменная.
Другие советы
Вы включили <search.h>
который определяет lfind
? Если функция вызывается без прототипа, ваш компилятор может предположить, что она возвращает int
.
Я не думаю, что приведенные выше вопросы действительно решают проблему, так как у меня возникла эта проблема. Истинный ответ, который я считаю, - это различие между прототипом BSearch и прототипом LFIND. Давайте взглянем
void *bsearch(const void *key, const void *base, size_t nmemb,
size_t size, int (*compar)(const void *, const void *));
Против
void *lfind(const void *key, const void *base, size_t *nmemb,
size_t size, int(*compar)(const void *, const void *));
Если вы заметите, что третий параметр функции LFIND является указателем на тип size_t, а не (как в функции BSEARCH), прямое копированное значение.
Просто убедитесь, что вы передали адрес размера, и все будет хорошо.