реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Вопрос по qsort() в С/С++ - макс. число элементов=?, глюки при числе элементов более 1500+- ...
Supernaut
сообщение Jul 19 2007, 07:37
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 31
Регистрация: 12-05-06
Пользователь №: 17 028



Привет всем!
Господа, программирующие на С/С++! Подскажите, каково максимальное число элементов для сортировки для функции qsort()? В хелпе вскользь намекается, что size_t - тип беззнаковое целое, т. е. занимает 4 байта (компилятор IAR, пишу под AT91... ARM). То есть, подразумевается довольно большое число сортируемых элементов?
А у меня прога глючит при числе элементов уже более 1500... Для малых массивов данных - работает как часы! Или лучше писать свою функцию сортировки?
Спасибо!
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jul 19 2007, 07:58
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



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


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

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

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


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Supernaut
сообщение Jul 19 2007, 08:16
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 31
Регистрация: 12-05-06
Пользователь №: 17 028



Цитата(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;
}
Go to the top of the page
 
+Quote Post
Oldring
сообщение Jul 19 2007, 11:09
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874



Цитата(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 байтам?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 09:47
Рейтинг@Mail.ru


Страница сгенерированна за 0.01364 секунд с 7
ELECTRONIX ©2004-2016