Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
1

qsort

27.06.2011, 22:49. Просмотров 1138. Ответов 7
Метки нет (Все метки)

Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <cstdio>
#include <algorithm>
 
int compare(const void *s1, const void *s2)
{
    return strcmp((char *)s1, (char *)s2) < 0;
}
 
#define N 4
 
int main()
{
    const char *words[N] = {"needle", "ascii", "cpp", "ass"};
 
    qsort(words, N, sizeof(char *), compare);
    //std::sort(words, words+4, compare);
 
    for (size_t i = 0; i < N; ++i) {
        printf("%s\n", words[i]);
    }
 
    return 0;
}
На Visual Studio 2008 вывод
такой,
needle
ascii
cpp
ass
то есть последовательность не изменяется, а на g++ переставляется в обратном
порядке.
ass
cpp
ascii
needle
Если qsort закомментировать, а std::sort наоборот раскомментировать, то вывод получается
ожидаемым.
ascii
ass
cpp
needle
Что не так с qsort? Почему она не работает ожидаемым образом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2011, 22:49
Ответы с готовыми решениями:

qsort
Вот код программы. Посмотрите вопрос в комментарии. #include &lt;iostream&gt;...

qsort
Ребят,расскажи подробно и простенько про qsort;Видел тему,но ничего не понял.Я...

qsort
читал, что с помощю QSORT можно упорядочить масив, но не пишет как. помогите!!

qsort C++
Помогите, плиз,разобраться с этой функцией, я прогу написала, но мало чего...

сортировка qsort
Есть динамический массив, содержащий строки в строках слова, формат такой аа...

7
Jupiter
Каратель
Эксперт С++
6569 / 3990 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.06.2011, 22:53 2
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
0
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 22:58  [ТС] 3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
Получается все наоборот, студия последовательность переставляет в обратном порядке, а g++ не изменяет. Но сортировка так и не работает.
0
grizlik78
Эксперт С++
1987 / 1480 / 191
Регистрация: 29.05.2011
Сообщений: 3,059
27.06.2011, 22:58 4
Правильный вид этой функции для qsort такой:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(char * const *)s1, *(char * const *)s2);
}
указатели передаются по указателю, так что надо разыменовывать. Ну и возвращать результат самой strcmp
1
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:03  [ТС] 5
Цитата Сообщение от grizlik78 Посмотреть сообщение
Правильный вид этой функции для qsort такой:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(char * const *)s1, *(char * const *)s2);
}
указатели передаются по указателю, так что надо разыменовывать. Ну и возвращать результат самой strcmp
Работает
s1 и s2 приводятся к типу "указатель на константный указатель на char" а потом разыменовыаются и мы получаем "константный указатель на char" то есть строку, так?
0
grizlik78
Эксперт С++
1987 / 1480 / 191
Регистрация: 29.05.2011
Сообщений: 3,059
27.06.2011, 23:06 6
Ну, qsort должна уметь работать с любыми данными, поэтому они передаются через указатели на void. Но поскольку там реально указатели на char*, то сначала преобразовываем к char**, а потом разыменовываем.
0
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:19  [ТС] 7
Тогда можно сделать так:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(const char * const *)s1, *(const char * const *)s2);
}
Ведь это функция сравнения, и она не должена изменять свои параметры.
0
grizlik78
Эксперт С++
1987 / 1480 / 191
Регистрация: 29.05.2011
Сообщений: 3,059
27.06.2011, 23:21 8
Да, можно. Но я не стал менять форму, которая приведена у меня в мане
0
27.06.2011, 23:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 23:21

Функция Qsort
Прошу ознакомить меня с функцией Qsort. Если можно, то не мудрено и на...

Vector and qsort
Здравствуйте, есть код: #include &quot;iostream&quot; #include &quot;vector&quot; using...

не работает qsort
#include &lt;iostream&gt; #include &lt;math.h&gt; #include &lt;iomanip&gt; #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru