Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сортировка в TList.

12K
28 января 2007 года
Шмель
20 / / 20.04.2006
Здравствуйте.
Возникла сложность с реализацией сортировки в списке TList. В помощи указано:
 
Код:
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);


Не могу понять первую строчку - определение вроде типа, а вроде функции. Как правильно определить в свою функцию сравнения? И как указать ее в сортировщике TList->Sort(...) ?
В контексте какого вопроса интересуюсь? Для начала интересует отсортировать все строки из файла. Вот вырезка:
Код:
TList *MyList = new TList;

     //Читаем строчки из файла в память
     while(fgets(str, MaxLenghStr, in) != NULL)
           {
               strbuf = new char[strlen(str)+1];
               strcpy(strbuf, str);
               if(strbuf == NULL)
                  {
                      cprintf("Not empty memory!!!!");
                      getch();
                      exit(1);
                  }
               MyList->Add(strbuf);
           }


Понимаю, что можно воспользоваться TStringLists, но хотелось бы овладеть более широким инструментом.
Пример в хелпнике читал, так появилось ещё больше вопросов (создаем функцию CompareNames, а указываем CompareText, да еще как указываем)...
Прошу направить на путь истинный. Спасибо.

PS: Раньше программировал на "линейном" Си, сейчас осваиваю C++, потому прошу сильно не пинать...
294
29 января 2007 года
Plisteron
982 / / 29.08.2003
Цитата: Шмель
Здравствуйте.
Возникла сложность с реализацией сортировки в списке TList. В помощи указано:
 
Код:
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);


Не могу понять первую строчку - определение вроде типа, а вроде функции. Как правильно определить в свою функцию сравнения?


Это определения типа, а тип -- указатель на __fastcall функцию, принимающую в качестве аргумента два указателя на void и возвращающую целое число типа int. Т.е. твоя функция сравнения двух элементов списка должна описываться примерно так:

 
Код:
int __fastcall MyListCompare(void *ItemFirst, void *ItemSecond);
И сортировать список можно, соответственно,
 
Код:
MyList->Sort(MyListCompare);

Цитата: Шмель
PS: Раньше программировал на "линейном" Си, сейчас осваиваю C++, потому прошу сильно не пинать...


А такое объявление указателя на функцию и в линейном Си есть, за исключением слова [FONT=Courier New]__fastcall[/FONT].
PS: Вот за это я и люблю C и C++!

309
29 января 2007 года
el scorpio
1.1K / / 19.09.2006
В качестве функции сравнения можно использовать не только "чистую" функцию, но и соответствующий по параметрам статический (static) метод какого-нибудь класса, так как в статические методы указатель this не передаётся.

А вот сама функция сравнения содержит кучу глюков. Например, проверка выделения памяти происходит после копирования строки по этому указателю :D. При том, что new NULL обычно не возвращает, а сразу кидает Exception.

И со строками куда проще и надёжнее работать через классы AnsiString и TStringList
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог