2009-08-16 1 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()의 세 번째 인수는 size_t이 아니라 int의 포인터입니다. size_t 유형은 일부 아키텍처 (특히 x86-64)에서는 int과 다른 크기 일 수 있으며 서명도 없습니다. 변수 length의 유형을 변경해야합니다.

4

lfind을 정의하는 <search.h>을 포함 시켰습니까? 프로토 타입없이 함수를 호출하면 컴파일러에서 int을 반환한다고 가정 할 수 있습니다.

0

위의 질문을 통해이 문제가 실제로 해결되었다고 생각하지 않습니다. 내가 믿는 진정한 대답은 bsearch 프로토 타입과 lfind 프로토 타입 간의 차이다. 당신이 lfind 함수의 세 번째 매개 변수합니다 (bsearch 함수로) 입력하지 size_t로에 대한 포인터 것을 알 수있는 경우의이

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 *)); 

을 찾아 직접 복사 값을겠나하자 .

크기의 주소를 전달하면됩니다.