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

Просто убедитесь, что вы передаете адрес размера, и все будет хорошо.

Другие вопросы по тегам