2010-01-03 3 views
1

누구나 표준 바이너리 검색 기능이 구현되는 방법을 알고 있습니까?표준 C 라이브러리의 bsearch() 함수는 어떻게 구현됩니까?

이것은 프로토 타입입니다.

void * bsearch (const void*, const void*, size_t, size_t, int (*) (const void *, const void *)); 

나는 그들이 void 포인터를 어떻게 사용했는지에 대해 정말 궁금합니다.

+0

주소를 계산할 때 'char *'와 동일한 'void *'를 처리하는 CCC 표준은 'void *'값에 대한 주소 연산을 수행 할 수 없다고 말하면서 GCC와 조화를 이루는 코드를 조심하십시오. –

+0

@Jonathan : 나는 GCC가 어떻게되는지에 대해 확신하지 못한다. 그가 열거 한 프로토 타입 (유일하게 'void *'이 질문에 언급되어있다)은 C99 표준에서 나온 것이다. –

+0

Jonathan의 코멘트는'void * '에 대한 산술에 의존하는'bsearch'의 구현에 관한 것이라고 저는 믿습니다. 이식 가능한 구현 (즉, 표준을 준수하는 구현)은 그렇게 할 수 없습니다. –

답변

3

실제 이진 검색 알고리즘이 아닌 에 void * 포인터가 사용되는 방법을 알고 싶다고 가정합니다. bsearch의 프로토 타입은 다음과 같습니다 임의의 유형을 검색 할 수 있도록

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

void * 사용됩니다. 포인터의 해석은 (사용자 제공) compar 기능에 의해 수행됩니다. 배열의 시작 부분에 대한 포인터 base 포인트 이후

, 및 배열의 ​​요소가 연속으로 보장, bsearch는 포인터 연산을 수행하여 배열의 nmemb 요소 중 하나에 void * 포인터를 얻을 수 있습니다. 이 유형 void *의 때문에

상기 니펫
unsigned char *base_p = base; 
size_t n = 5; 
/* Go 5 elements after base */ 
unsigned char *curr = base_p + size*n; 
/* curr now points to the 5th element of the array. 
    Moreover, we can pass curr as the first or the second parameter 
    to 'compar', because of implicit and legal conversion of curr to void * 
    in the call */ 

, 우리 base 직접 size*n를 추가 할 수 있고, 연산의 예를 들어, 어레이의 제 5 요소에 대한 포인터를 얻기 위해 (nmemb >= 5 가정) void *이 정의되지 않았습니다.

+0

이 트릭이 표준에서 허용되지 않는다고 생각합니다. –

+0

@Dave : 어떤 부분을 언급하고 있습니까? –

+0

(void *)에서 (char *) 로의 형변환. 어쨌든 확인했는데 허용되었습니다. 고맙습니다. –

-1

소스를 확인하십시오. 당신이 VS 표준 이상이있는 경우, 참조 :

C : \ 프로그램 파일 \의 Microsoft Visual Studio 8 \ VC \의 CRT \ SRC \를

관련 문제