1

我正在用 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

不过,该程序仍然可以正常工作。

4

3 回答 3

4

您是否包含<search.h>了哪些定义lfind?如果在没有原型的情况下调用函数,您的编译器可能会假定它返回int.

于 2009-08-16T01:11:13.987 回答
1

lfind() 的第三个参数是指向size_tnot的指针int。该size_t类型的大小可能与int某些体系结构(特别是 x86-64)上的不同,并且它也是无符号的。您必须更改length变量的类型。

于 2009-08-16T01:51:17.853 回答
0

我认为上述问题并不能真正解决问题,因为我遇到了这个问题。我认为真正的答案是 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 函数中)直接复制的值。

只要确保你传入大小的地址就可以了。

于 2012-04-25T20:32:47.983 回答