Использование qsort из cstdlib

Я пытаюсь запустить qsort из cstdlib. Функция

qsort(m_all_animals, numberOfAnimals(), sizeof(Animal*), сравнить);

выполняется успешно, но не сортирует 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();
}

У меня есть следующая иерархия наследования, если это помогает

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

person Slazer    schedule 04.08.2013    source источник
comment
«Я пытаюсь запустить qsort из cstdlib» — почему? Вы знаете о std::sort?   -  person Konrad Rudolph    schedule 04.08.2013
comment
@KonradRudolph Я должен использовать qsort, потому что так сказал мой учитель. Он прямо запрещает мне использовать std::sort.   -  person Slazer    schedule 04.08.2013
comment
Замечательный учитель. (Ну, если честно, может быть, есть смысл учить этому… но хм.)   -  person Konrad Rudolph    schedule 04.08.2013
comment
Мне интересно. Ваш учитель пытается преподавать C++ или C?   -  person juanchopanza    schedule 04.08.2013
comment
@juanchopanza На самом деле курс C является обязательным условием для курса C ++. Причина использования qsort заключается в том, что мы еще не изучили std::sort на курсе C++, но мы изучили qsort на курсе C.   -  person Slazer    schedule 04.08.2013
comment
Затем вам следует научиться забывать о qsort и узнать о std::sort. Вам придется много разучиться, если вы изучали C как необходимое условие BTW.   -  person juanchopanza    schedule 04.08.2013
comment
Придется защищать учителя. Учащиеся CS должны изучать как C, так и C++, и кажется, что учитель поступает правильно. Некоторые из более поздних классов CS потребуют использования C (операционные системы, высокопроизводительные вычисления).   -  person unxnut    schedule 04.08.2013
comment
@unxnut Хорошо выучить оба, но это не значит, что C нужно изучать как необходимое условие для C ++. Конечно, настаивать на использовании qsort в программе на C++ кажется довольно контрпродуктивным.   -  person juanchopanza    schedule 04.08.2013
comment
Преподаватель, по-видимому, обучает функциям C++, которые ограничены только C. Таким образом, он не обучает C как предпосылку для C++. Но мы, кажется, отходим от первоначального вопроса, обсуждая намерения учителя (или учебного плана).   -  person unxnut    schedule 04.08.2013
comment
@unxnut «Учитель, похоже, занимается тем, что обучает функциям C++, которые ограничены C». – именно так, и существует широкий консенсус в отношении того, что это ужасный способ преподавания C++. Это все равно, что учить водить машину, только показывая черты, общие для машины и лошади.   -  person Konrad Rudolph    schedule 04.08.2013
comment
@KonradRudolph Опять же, это вопрос мнения. Нам придется изучить некоторые формальные исследования, чтобы увидеть, что лучше.   -  person unxnut    schedule 04.08.2013


Ответы (3)


У вас есть массив указателей на Animal, поэтому ваша функция compare фактически принимает указатели на указатели на Animal:

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

Не используйте qsort() в C++! Он медленный, небезопасный для типов и приведет к хаосу при использовании на типах, отличных от POD. Вместо этого используйте std::sort().

person Dietmar Kühl    schedule 04.08.2013

Ваши указатели неверны. У вас есть массив указателей (Animal *); это должен быть массив данных типа Animal, а не указатель, если вы хотите использовать свой compare. Или вам нужно будет изменить compare для работы с Animal **.

person unxnut    schedule 04.08.2013