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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2011, 21:00   #1
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию Задание функции compare для qsort

Как задать функцию? Пишу так:
Код:
qsort((void*)matrix,size,sizeof(module),compare);
где compare
Код:
int compare(void* one, void* two)
{
	return strcmp(((module*)one)->res,((module*)two)->res);
}
структура module содесжит строку res и интовое число. Вот по строкам в алфавитном порядке мне отсортировать и надо. соответственно matrix-массиd структур module
Farrel вне форума Ответить с цитированием
Старый 26.02.2011, 21:10   #2
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

А проблема то в чем?
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 26.02.2011, 21:13   #3
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

const void* же. Ведь операция сравнения ничего не должна менять, логично? Вот так выглядит объявление qsort:
Код:
void qsort(void *base, size_t nmemb, size_t size, int (*compare)(const void *, const void *));
Алсо если ты пишешь на C++, то используй std::sort. Правда, я так понял, ты таки пишешь на C, ведь приведение типов в стиле C.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 26.02.2011 в 21:19.
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 21:22   #4
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

Цитата:
Сообщение от Syuf Посмотреть сообщение
А проблема то в чем?
Прошу прощения, забыл.

1>c:\users\technodrive\documents\vi sual studio 2010\projects\курсач\курсач\bwt.h(2 1): error C3867: bwtcoder::compare: в вызове функции отсутствует список аргументов; используйте "&bwtcoder::compare" для создания указателя на член

Честно говоря, не понимаю, какие параметры можно передать функции compare
Farrel вне форума Ответить с цитированием
Старый 26.02.2011, 21:42   #5
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Дейтсвительно, нужно поменять
Код:
int compare(void* one, void* two)
{
	return strcmp(((module*)one)->res,((module*)two)->res);
}
на
Код:
int compare(const void* one, const void* two)
{
	return strcmp(((module*)one)->res,((module*)two)->res);
}
как было подмечено. VS2008 ругается только только на это. Однако, судя по сообщению приведенному выше, 2010 требует еще и взятие адреса:
Код:
qsort((void*)matrix,size,sizeof(module),&compare);
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."
Syuf вне форума Ответить с цитированием
Старый 26.02.2011, 21:44   #6
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

void qsort(void *base, size_t num, size_t size, int (*comparator)(const void *, const void *));
base Pointer to the first element of the array to be sorted.
num Number of elements in the array pointed by base.
size Size in bytes of each element in the array.
comparator Function that compares two elements. The function shall follow this prototype:
int comparator ( const void * elem1, const void * elem2 );
The function must accept two parameters that are pointers to elements, type-casted as void*. These parameters should be cast back to some data type and be compared.
The return value of this function should represent whether elem1 is considered less than, equal to, or greater than elem2 by returning, respectively, a negative value, zero or a positive value.

И ведь это логично, ведь компаратор не должен иметь права изменять сравниваемое!
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 26.02.2011 в 21:47.
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 21:59   #7
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

const дописал, вроде все в порядке с этой частью, но вот при добавлении & получил

1>c:\users\technodrive\documents\vi sual studio 2010\projects\курсач\курсач\bwt.h(2 1): error C2276: &: недопустимая операция с выражением привязанной функции-члена


пробуем такой вариант:

&bwtcoder::compare

1>c:\users\technodrive\documents\vi sual studio 2010\projects\курсач\курсач\bwt.h(2 1): error C2664: qsort: невозможно преобразовать параметр 4 из "int (__thiscall bwtcoder::* )(const void *,const void *)" в "int (__cdecl *)(const void *,const void *)"

если так:
&(bwtcoder::compare)

1>c:\users\technodrive\documents\vi sual studio 2010\projects\курсач\курсач\bwt.h(2 1): error C2276: &: недопустимая операция с выражением привязанной функции-члена

Последний раз редактировалось Farrel; 26.02.2011 в 22:06.
Farrel вне форума Ответить с цитированием
Старый 26.02.2011, 22:29   #8
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Ито за bwtcoder::? В Си пространств имён нет.
И нет, операцию взятия адреса для функции не надо проводить. Просто пиши qsort((void*)твой_массив,колво_элем ентов,sizeof(module),compare);
А что за module-то? Что за тип такой? Судя по использованию strcmp, вместо module тебе надо писать char* везде.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su

Последний раз редактировалось Obey-Kun; 26.02.2011 в 22:32.
Obey-Kun вне форума Ответить с цитированием
Старый 26.02.2011, 22:46   #9
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

пишу на плюсах, а "сишные отступления" использую т.к. удобнее
bwtcoder - имя класса, действительно забыл предупредить. Весь код приводить не стал, т.к. когда код большой, тему никто не читает
проверено.
и просто с compare летит ошибка которую я уже писал в своём втором посте
Farrel вне форума Ответить с цитированием
Старый 26.02.2011, 23:54   #10
Farrel
Форумчанин
 
Аватар для Farrel
 
Регистрация: 21.04.2010
Сообщений: 144
По умолчанию

В конце концов разобрался. Всего то и надо было, чтобы compare была отдельной функцией а не членом класса, как было у меня.
Всем кто пытался помочь, спасибо. Вот как всегда, хотел как лучше, чтоб в посте поменьше лишнего кода было, а получилось что сть проблемы не показал
Farrel вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задание на процедуры и функции neomax38 Помощь студентам 4 07.01.2011 23:16
Задание функции (Pascal) k0tone Помощь студентам 2 15.11.2010 16:29
qsort Jauhen Общие вопросы C/C++ 5 26.05.2010 01:15
qsort и структуры burzum Общие вопросы C/C++ 1 26.11.2009 13:23