| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Помогите с вызовом функции |
| Автор: Warchief 24.5.2007, 11:16 | ||
| Помогите пожалуйста!!! Задача написать програму для сортировке чего-угодно методом 'quick sort', с использованием template классов. В принципе сам алгоритм не проблема(надеюсь). Не знаю просто как вызвать методы класса в int main. Вот примерно структура программы(функции, которые пустые, я напишу сам). Объясните как мне вызвать эти функции в int main пожалуйста. Вот код:
Спасибо зарание!!! |
| Автор: v_nikolaev 24.5.2007, 11:23 |
| массив то объявлен как локальная переменная для функции и он убивает параметр A или я что-то недоглядел? Добавлено @ 11:25 generateAscending(А,int n) зачем в вызове функции указывать int? Добавлено @ 11:33 в теле функции нужно убрать определение массива. Array<int> A(n); Надо будет добавить функцию-член класса Array, которая увеличивает размер массива и использовать её. Объявляешь Array в main - передаёшь его нужной функции класса Sort... Array<Item*>& A - а почему не Array<Item>& A. Тут получается специализация для указателей, разве не так? |
| Автор: Warchief 24.5.2007, 11:36 | ||
| Если я вызываю функцию так: t.generateAscending(А,n) то компайлер говорит: quicksort.cpp(55) : error C2065: 'А' : undeclared identifier quicksort.cpp(55) : error C2065: 'n' : undeclared identifier Так как мне быть? я уже просто измучался с этим вызовом. :( Добавлено через 2 минуты и 3 секунды
Так посртавленно задание. |
| Автор: Warchief 24.5.2007, 11:43 | ||||||
Всё окончательно запутался :( А разве это не определение?
|
| Автор: v_nikolaev 24.5.2007, 11:51 | ||
Что-то такое можно предложить:
|
| Автор: Fazil6 24.5.2007, 11:54 | ||
нет. Это не то. или я ничего не понял или тебе еще надо писать частичную специализацию Array для указателей вот так тот кусок который у тебя написан будет работать, но для int , а не для int*
|
| Автор: v_nikolaev 24.5.2007, 11:57 |
| Кстати, зачем сорт темплейтный? |
| Автор: Warchief 24.5.2007, 12:05 | ||
Точно не знаю сам(не сказали), дали имена функциий и сказали допишите программу. В програме должно быть несколько вариантов быстрой сортироки(различие только в выборе опорного элемента). Может быть поэтому... Подскажите, пожалуйста всё-таки, чего не хватает чтобы работали функции с generateAscending(Array<Item*>& A,int n), а не generateAscending(Array<Item>& A,int n). Т.к. иначе задание не выполненно. :( Пасиб вам за помощь!!! |
| Автор: Fazil6 24.5.2007, 12:12 | ||||
видимо, чтобы связать Sort и Array может быть вот так тебе надо?
Добавлено @ 12:17 правда тут еще надо деструктор
|
| Автор: Warchief 24.5.2007, 12:18 |
Вот спасибо, вороде то, что нужно, попробую дальше раобраться с самим сортом |
| Автор: v_nikolaev 24.5.2007, 12:21 | ||||||||||
суть такая (задание немного кривое). Вообще сортировка иногда производится над указателями на объекты, так как последние могут оказаться большими. (А в случае инта - объект такой же, как и указатель по размеру). Темплейтный Sort, я могу объяснить лишь как способ не использовать функцию swap, о которой я упоминал. А вообще все сортировки могли бы быть и просто шаблонными функциями а Sort - нетемплейтным. Если темплейтный, то generateAscending(Array<Item*>& A,int n) не является специализацией для указателей - я слегка ошибся, просто не увидел сразу, что Sort - шаблон. Оставляешь Sort шаблоном Функцию generateAscending пишешь так: void generateAscending(Array<Item*>& A,int n) { // Если n больше реальной длины массива, и указатели // ни на что не указывают, то мы получим падающую прогу // хрень в общем. for (int i = 0; i < n; i++) *A[i] = i+1; for (int i = 0; i < n; i++) cout<<A[i]<<" "; } Но вообще то всё это не очень умно и работать в нашей программе это не будет - ведь объекты, указатели на которые хранятся в массиве, надо сами где-то хранить... generateAscending - тогда имеет бессмысленый параметр размера массива - мы ведь не можем его просто так увеличить, да ещё и присвоить значения несуществующим элементам. бардак какой-то в задании. Добавлено через 2 минуты и 35 секунд
в деструкторе надо убивать ещё элементы массива. а зачем связывать класс сорт и массив??? |
| Автор: Fazil6 24.5.2007, 13:08 |
да, надо, но возлагать на контейнер в данном случае не нужно, как впрочем и заполнение его возлагать на класс Sort. Array не знает что в нем хранится и если заполняли его оператором new вне контейнера, то и delete для конкретного элемента нужно делать вне Array до его удаления |
| Автор: Warchief 25.5.2007, 02:45 | ||
| Вот с вашей помощью вроде написал: Посмотрите пожалуйста, может нужно что-нибудь подправить? Есть ещё вопрос, после того как я массив сгенерирован, как мне сделать с него копию? Методы partition1..3 отличаются только тем,что элемент пивот вцчисляется по разному. функции qSort1...3 вызывают соответствующий метод partition
|
| Автор: v_nikolaev 25.5.2007, 08:38 |
| for (int j = l; j <= r-1; j++) так разве пишут в C-ях? for (int j = l; j < r; j++) разницы то нет, но стиль правильнее, имхо |