Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.05.2010, 00:09   #1
Jauhen
 
Регистрация: 25.05.2010
Сообщений: 3
По умолчанию qsort

Уважаемые господа программисты. Мне нужно отортировать массив данных структур:

struct Stud3
{
string Name;
int cost;
string controlDate;
...
};

по полю Name. Естественно я пытаюсь воспользоваться функцией qsort, предварательно написав функцию сравнения
int compare(const Stud3 *s1, const Stud3 *s2);

но!
когда я в qsort в качестве последнего параметра передаю эту функцию, возникает ошибка
error C2664: 'qsort': cannot convert parameter 4 from 'int(__cdecl *)(const Stud3 *, const Stud3 *)' to 'int(__cdecl *)(const void *, const void *)'

Я что-то путаю, или void* может принимать значения указателей на любые объектные типы? Почему же тогда возникает такая ошибка?
Jauhen вне форума Ответить с цитированием
Старый 26.05.2010, 00:32   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

попробуйте сделать приведение к нужному типу, так как С всеттаки строгий язык
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 26.05.2010, 00:34   #3
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Пепел Феникса
он пишет на плюсах. и нужно не приводить к нужному типу, а объявить функцию с требуемыми типами, ибо qsort ожидает указатель на функцию, в которую передаются константные указатели типа void
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.05.2010, 00:49   #4
Jauhen
 
Регистрация: 25.05.2010
Сообщений: 3
По умолчанию

если я объявлю функцию с указателями на void, то я не смогу внутри нее подступиться к нужному мне полю Name моей структуры через параметры... и еще вот пример функции сравнения для qsort с параметрами типа double*, которая прекрасно работает:
int compare_doubles (const double *a, const double *b)
{
return (int) (*a - *b);
}

а приведение где делать-то??
Jauhen вне форума Ответить с цитированием
Старый 26.05.2010, 01:07   #5
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2Jauhen
вот внутри функции compare и делай приведение к своей структуре

Цитата:
и еще вот пример функции сравнения для qsort с параметрами типа double*, которая прекрасно работает:
плохой компилятор у тебя. почитай страуструпа, глава 7, раздел 7, в самом конце

Цитата:
функция должна вызываться через указатель на функцию с (в точности) правильными типами аргументов и возвращаемого значения. не производится неявного преобразования типов аргументов
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 26.05.2010, 01:15   #6
Jauhen
 
Регистрация: 25.05.2010
Сообщений: 3
По умолчанию

Огромное спасибо, все работает
Jauhen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
qsort и структуры burzum Общие вопросы C/C++ 1 26.11.2009 13:23
Функция qsort() phpcreator Общие вопросы C/C++ 1 19.10.2009 22:34