Форум программистов, компьютерный форум CyberForum.ru

qsort - C++

Восстановить пароль Регистрация
 
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 22:49     qsort #1
Вот код:
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? Почему она не работает ожидаемым образом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.06.2011, 22:49     qsort
Посмотрите здесь:

C++ qsort
qsort C++ C++
C++ Qsort
Функция Qsort C++
Vector and qsort C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.06.2011, 22:53     qsort #2
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 22:58  [ТС]     qsort #3
Цитата Сообщение от Maxwe11 Посмотреть сообщение
а если так?
C++
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp((char *)s1, (char *)s2);
}
Получается все наоборот, студия последовательность переставляет в обратном порядке, а g++ не изменяет. Но сортировка так и не работает.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 22:58     qsort #4
Правильный вид этой функции для qsort такой:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(char * const *)s1, *(char * const *)s2);
}
указатели передаются по указателю, так что надо разыменовывать. Ну и возвращать результат самой strcmp
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:03  [ТС]     qsort #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" то есть строку, так?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 23:06     qsort #6
Ну, qsort должна уметь работать с любыми данными, поэтому они передаются через указатели на void. Но поскольку там реально указатели на char*, то сначала преобразовываем к char**, а потом разыменовываем.
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
27.06.2011, 23:19  [ТС]     qsort #7
Тогда можно сделать так:
C
1
2
3
4
int compare(const void *s1, const void *s2)
{
        return strcmp(*(const char * const *)s1, *(const char * const *)s2);
}
Ведь это функция сравнения, и она не должена изменять свои параметры.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.06.2011, 23:21     qsort
Еще ссылки по теме:

C++ не работает qsort
qsort C++
C++ qsort

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
27.06.2011, 23:21     qsort #8
Да, можно. Но я не стал менять форму, которая приведена у меня в мане
Yandex
Объявления
27.06.2011, 23:21     qsort
Ответ Создать тему
Опции темы

Текущее время: 10:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru