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()への3番目の引数は、渡したままではsize_tないintことへのポインターです。タイプは、一部のアーキテクチャー(特にx86-64)とはsize_tサイズが異なる場合があり、署名もありません。変数intのタイプを変更する必要があります。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関数の3番目のパラメーターが、(bsearch関数のように)直接コピーされた値ではなく、size_t型へのポインターであることに気付く場合。

サイズのアドレスを渡してください。問題はありません。

于 2012-04-25T20:32:47.983 に答える