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

При этом программа по-прежнему работает корректно.


person Community    schedule 16.08.2009    source источник


Ответы (3)


Третий аргумент lfind() — это указатель на size_t, а не на int, который вы передаете. Тип size_t может иметь размер, отличный от int на некоторых архитектурах (в частности, x86-64), и он также не имеет знака. Вы должны изменить тип переменной length.

person Juliano    schedule 16.08.2009

Вы включили <search.h>, который определяет lfind? Если функция вызывается без прототипа, ваш компилятор может предположить, что она возвращает int.

person Greg Hewgill    schedule 16.08.2009

Я не думаю, что приведенные выше вопросы действительно решают проблему, поскольку у меня была эта проблема. Верный ответ, я считаю, заключается в различии между прототипом поиска и прототипом поиска. Давайте взглянем

 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) прямым скопированным значением.

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

person Vivek    schedule 25.04.2012