Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вопрос по qsort() в С/С++ - макс. число элементов=?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы > Программирование
Supernaut
Привет всем!
Господа, программирующие на С/С++! Подскажите, каково максимальное число элементов для сортировки для функции qsort()? В хелпе вскользь намекается, что size_t - тип беззнаковое целое, т. е. занимает 4 байта (компилятор IAR, пишу под AT91... ARM). То есть, подразумевается довольно большое число сортируемых элементов?
А у меня прога глючит при числе элементов уже более 1500... Для малых массивов данных - работает как часы! Или лучше писать свою функцию сортировки?
Спасибо!
Oldring
Цитата(Supernaut @ Jul 19 2007, 11:37) *
Привет всем!
Господа, программирующие на С/С++! Подскажите, каково максимальное число элементов для сортировки для функции qsort()? В хелпе вскользь намекается, что size_t - тип беззнаковое целое, т. е. занимает 4 байта (компилятор IAR, пишу под AT91... ARM). То есть, подразумевается довольно большое число сортируемых элементов?
А у меня прога глючит при числе элементов уже более 1500... Для малых массивов данных - работает как часы! Или лучше писать свою функцию сортировки?
Спасибо!


В чем проявляются глюки?

qsort - старый давно используемый алгоритм и работает при любой длине. На 32-битном процессоре лучше не ожидать, что проявятся какие-либо ошибки в написании qsort на длине 1500.

Но нужно не забывать, что qsort имеет квадратичное время в худшем. Для qsort в MSVC, например, одним из тяжелых случаев были массивы с большим количеством идущих подряд одинаковых элементов. Весьма возможно, что и в IAR qsort обладает тем же поведением. В таких случаях нужно использовать другие алгоритмы сортировки - не зря их существует множество.
Supernaut
Цитата(Oldring @ Jul 19 2007, 14:58) *
В чем проявляются глюки?

qsort - старый давно используемый алгоритм и работает при любой длине. На 32-битном процессоре лучше не ожидать, что проявятся какие-либо ошибки в написании qsort на длине 1500.

Но нужно не забывать, что qsort имеет квадратичное время в худшем. Для qsort в MSVC, например, одним из тяжелых случаев были массивы с большим количеством идущих подряд одинаковых элементов. Весьма возможно, что и в IAR qsort обладает тем же поведением. В таких случаях нужно использовать другие алгоритмы сортировки - не зря их существует множество.


Глюки проявляются в том, что контроллер просто зависает! Т. е, не выходит из этой функции. И это при числе элементов уже порядка 3000. А уменя реальный массив из 30000 элементов! Насчет одинаковых элементов - их в моем массиве заведомо нет, все разные!

Приведу для ясности кусок кода, может, кто-нибудь увидит ошибку.

// формируем указатели на массив указателей на структуры типа Spl
Spl **rec_ptr_array;
// выделяем память под массив согласно кол-ву структкр - их может быть порядка 30.000
rec_ptr_array=new Spl *[N];
if(rec_ptr_array!=NULL)
{
// инициализируем массив указателей на структуры типа Spl
for(k=0;k<N;k++)
{
rec_ptr_array[k]=(Spl *)(Start_addr+2*(offset+3*k));
}

// включаем светодиод
SetLED(TX, RED);
// сортируем структуры в порядке возрастания значения одного из полей
qsort((void *)rec_ptr_array[0], N, 6, spl_compare);
// выключаем светодиод
SetLED(TX, OFF);
}
И далее, функция сравнения двух элементов:
int spl_compare(const void *a, const void *cool.gif
{
Spl *pa=(Spl *)a,
*pb=(Spl *)b;
if(pa->Get_SN() > pb->Get_SN())
return 1;
else if(pa->Get_SN() == pb->Get_SN())
return 0;
else
return -1;
}
Oldring
Цитата(Supernaut @ Jul 19 2007, 12:16) *
Глюки проявляются в том, что контроллер просто зависает! Т. е, не выходит из этой функции. И это при числе элементов уже порядка 3000. А уменя реальный массив из 30000 элементов! Насчет одинаковых элементов - их в моем массиве заведомо нет, все разные!

Приведу для ясности кусок кода, может, кто-нибудь увидит ошибку.

// формируем указатели на массив указателей на структуры типа Spl
Spl **rec_ptr_array;
// выделяем память под массив согласно кол-ву структкр - их может быть порядка 30.000
rec_ptr_array=new Spl *[N];
if(rec_ptr_array!=NULL)
{
// инициализируем массив указателей на структуры типа Spl
for(k=0;k<N;k++)
{
rec_ptr_array[k]=(Spl *)(Start_addr+2*(offset+3*k));
}

// включаем светодиод
SetLED(TX, RED);
// сортируем структуры в порядке возрастания значения одного из полей
qsort((void *)rec_ptr_array[0], N, 6, spl_compare);
// выключаем светодиод
SetLED(TX, OFF);
}
И далее, функция сравнения двух элементов:
int spl_compare(const void *a, const void *cool.gif
{
Spl *pa=(Spl *)a,
*pb=(Spl *)b;
if(pa->Get_SN() > pb->Get_SN())
return 1;
else if(pa->Get_SN() == pb->Get_SN())
return 0;
else
return -1;
}


cranky.gif

Плохо написанные программы обычно так себя и ведут. И программисты таких программ, как правило, грешат на компиляторы.

Значит, про sizeof вы не слышали? И уверены, что размер указателя равен 6 байтам?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.