2013-08-04 2 views
1

cstdlib에서 qsort를 실행하려고합니다. 함수cstdlib의 qsort 사용

qsort (m_all_animals, numberOfAnimals(), sizeof (Animal *), compare);

성공적으로 실행되지만 m_all_animals는 정렬되지 않습니다. 실제로 배열에 아무런 영향을주지 않습니다. 기본 데이터 구조는 여기

Animal** m_all_animals; 

//the number of elements, I tested it and it works 
int numberOfAnimals(){ 
    int result=0; 
    for (int i=0;i<m_size*2;++i){ 
     if (m_all_animals[i]==NULL) 
      break; 
     ++result; 
    } 
    return result; 
} 

int compare (const void* p1, const void* p2){ 
     return ((Animal*) p1)->get_size()-((Animal*) p2)->get_size(); 
} 

있습니다 나는 그렇게 당신의 compare 기능은 실제로 Animal에 대한 포인터에 대한 포인터를 취

Animal<-Bear 
Bear<-brown_bear 
brown_bear<-white_bear 
Bear<-panda_bear 
Animal<-snail 
+1

"qstore를 cstdlib에서 실행하려고합니다."- 왜? 당신은'std :: sort'를 알고 있습니까? –

+0

@KonradRudolph 선생님이 그렇게 말씀 하시므로 qsort를 사용해야합니다. 그는 나를 std :: sort를 사용하도록 명시 적으로 금지합니다. – Slazer

+0

멋진 선생님. (글쎄, 공평하게 말하자면, 이것을 가르치는 데 약간의 의미가있을 수 있지만, 음 .......) –

답변

2

이 너의이 Animal에 대한 포인터의 배열입니다 다음 상속 계층 구조를 할 수있는 경우 :

int compare (const void* p1, const void* p2){ 
     return (*(Animal**)p1)->get_size()-(*(Animal**)p2)->get_size(); 
} 
+0

이 방법으로 작동합니다. – Slazer

2

포인터가 올바르지 않습니다. 포인터 배열 (Animal *); compare을 사용하려면 포인터가 아닌 Animal 데이터 유형의 배열이어야합니다. 또는 Animal **으로 작업하려면 compare을 수정해야합니다.

4

C++에서 qsort()을 사용하지 마십시오! POD가 아닌 유형에 사용할 경우 유형이 안전하지 않고 느리고 유형이 혼란 스럽습니다. 대신 std::sort()을 사용하십시오.