Указатель из целого числа без предупреждения при вызове LFIND

StackOverflow https://stackoverflow.com/questions/1283246

  •  16-09-2019
  •  | 
  •  

Вопрос

Я пишу вектор в 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), прямое копированное значение.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top