2014-07-15 3 views
0

나는 이것을 이미 보았고 구현하려고 시도했지만 나에게 이렇게하면 seg 오류가 발생했다. Determining index from bsearch and lfind? - 여기에 참조 용 링크가있다.bsearch 또는 lfind에서 색인을 반환하는 방법은 무엇입니까? - sort distorts returns vals

기본적으로, 나는 bsearch 또는 lfind에 의해 반환되는 포인터에서 배열의 인덱스를 알아 내려고하고 있습니다.

: 다음

void *val; 
void *begin = (char *)v->elems (I need to use this separate variable) 

, 나는 위의 링크를 기반으로

val = bsearch(key, begin, v->count, v->elemsz, cmp); 

그리고 ... 잘 동작하는 것 중 하나를 검색, 촉구, 나는 다음을 수행하려고 해요

index = *(int*)((char*)value_to_find - (char*)start_ptr)/sizeof(cv->elemsz) 

그러나이 작업을 할 때마다 오류가 발생합니다. 내 논리는 void * 형식의 void 포인터를 모두 캐스팅 한 다음 void에 포인터 연산을 수행 할 수 없으므로 포인터를 거리 b/w에서 뺍니다. 이 값을 각 요소의 크기로 나눠 인덱스를 반환합니다.이 인덱스는 int로 캐스트해야합니다. 내가 여기서 무엇을 놓치고 있니?

편집 : sizeof (cv-> elemsz)를 elemsz로 변경하면 올바른 색인이 반환됩니다. 그러나 문제는 qsort를 사용하여 벡터를 정렬하면 잘못된 값 (20이 예상되면 인덱스 10 등)이 반환된다는 것입니다.

+1

실제로는 'elemsz' 변수의 크기로 나눕니다. 이것은 부호없는 정수 (32 비트 컴퓨터에서는 4 바이트)라고 가정합니다. 'cv-> elemsz'로 나누기 만 했습니까? –

+0

sizeof (cv-> elemsz)를 elemsz로 변경하면 올바른 색인이 반환됩니다. 그러나 문제는 qsort를 사용하여 벡터를 정렬하면 잘못된 값 (20이 예상되면 인덱스 10 등)이 반환된다는 것입니다. –

+0

@AustinMullins 감사합니다. 실제로, 그 일이 처리되었습니다! –

답변

0

elemsz 속성의 크기는 아마도 32 비트 부호없는 정수입니다 (즉, sizeof은 요소 크기에 관계없이 4를 반환합니다). 대신 cv->elemsz으로 나누십시오.

index = *(int*)((char*)value_to_find - (char*)start_ptr)/cv->elemsz; 

또한 반환 된 색인을 사용하려면 유사한 산술 연산을 수행해야합니다.