2009-08-16 7 views
1

私はCでベクトルを書いています。CVectorSearch関数はソートされていればbsearchを使い、ソートされていなければlfindを使います。 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 

プログラムはまだかかわらず、正常に動作しています。

答えて

1

lfind()の3番目の引数は、渡しているときにsize_tではなく、intへのポインタです。 size_tタイプは、一部のアーキテクチャ(特にx86-64)ではintとは異なるサイズであり、また符号なしです。変数lengthのタイプを変更する必要があります。

4

にはlfindが含まれていますか?関数がプロトタイプなしで呼び出された場合、コンパイラはintを返します。

0

私はこの問題を抱えているため、上記の質問が本当に問題を解決するとは思わない。私が信じる本当の答えは、bsearchプロトタイプとlfindプロトタイプの違いです。あなたがlfind関数の第三引数はsize_tの型ではありません(bsearchは関数のように)直接コピーされた値へのポインタであることがわかります場合

void *lfind(const void *key, const void *base, size_t *nmemb, 
       size_t size, int(*compar)(const void *, const void *)); 

void *bsearch(const void *key, const void *base, size_t nmemb, 
       size_t size, int (*compar)(const void *, const void *)); 

を見てtakeaみよう。

サイズのアドレスを渡すだけで大丈夫です。

関連する問題