typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);
Сортировка в TList.
Возникла сложность с реализацией сортировки в списке TList. В помощи указано:
Код:
Не могу понять первую строчку - определение вроде типа, а вроде функции. Как правильно определить в свою функцию сравнения? И как указать ее в сортировщике 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);
}
//Читаем строчки из файла в память
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++, потому прошу сильно не пинать...
Цитата: Шмель
Здравствуйте.
Возникла сложность с реализацией сортировки в списке TList. В помощи указано:
Не могу понять первую строчку - определение вроде типа, а вроде функции. Как правильно определить в свою функцию сравнения?
Возникла сложность с реализацией сортировки в списке TList. В помощи указано:
Код:
typedef int __fastcall (*TListSortCompare)(void * Item1, void * Item2);
void __fastcall Sort(TListSortCompare Compare);
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++!
А вот сама функция сравнения содержит кучу глюков. Например, проверка выделения памяти происходит после копирования строки по этому указателю :D. При том, что new NULL обычно не возвращает, а сразу кидает Exception.
И со строками куда проще и надёжнее работать через классы AnsiString и TStringList