Указатель от целого числа без предупреждения о приведении при вызове 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
Программа все еще работает правильно, хотя.
3 ответа
Третий аргумент 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) прямое скопированное значение.
Просто убедитесь, что вы передаете адрес размера, и все будет хорошо.