Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сортировка float в TList 
:(
    Опции темы
Нитонисе
Дата 25.11.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Есть такой код.

Код

TList *X = new TList;
float L = 3;
float FL;
float *fl;

// заполнения списка значениями
for (int j=0; j<9; j++)
  {
    FL = L/10 + j*L/10;
    fl = new float(FL);
    X->Add(fl);
  } // end for

// сортировка
X->Sort(SortFloat);

// вывод значений в мемо
for (int j=0; j<X->Count; j++)
  {
    FL = (*(float*)X->Items[j]);
    Memo1->Lines->Add(FloatToStrF(FL,ffFixed,7,3));
  } // end for

// чистка памяти
for (int j=0; j<X->Count; j++)
  {
    fl = (float*)X->Items[j];
    delete fl;
  } // end for
delete X;


Сортирующая функция SortFloat выглядит так

Код

int __fastcall SortFloat(void *Item1, void *Item2)
{
float X1 = *(static_cast<float*>(Item1));
float X2 = *(static_cast<float*>(Item2));
return X1-X2;
}


А вот это вывод в мемо значений

0,300
1,800
2,100
2,400
1,500
0,600
0,900
1,200
2,700

Они не отсортированы. Почему?
PM MAIL   Вверх
artsb
Дата 25.11.2009, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Насколько мне известно, static_cast лучше не использовать для указателей. Пробуйте так:
Код

int __fastcall SortFloat(void *Item1, void *Item2)
{
float *X1 = (float*)Item1;
float *X2 = (float*)Item2;
return *X1-*X2;
}


Это сообщение отредактировал(а) artsb - 25.11.2009, 20:18


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
Нитонисе
Дата 25.11.2009, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(artsb @  25.11.2009,  20:16 Найти цитируемый пост)
Насколько мне известно, static_cast лучше не использовать для указателей. Пробуйте так:

Не работает.
PM MAIL   Вверх
smoke_man
Дата 25.11.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



А почему бы не использовать, например, vector и sort?


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Нитонисе
Дата 25.11.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(smoke_man @ 25.11.2009,  20:49)
А почему бы не использовать, например, vector и sort?

Потому что я слабо знаком с контейнерами STL. Обхожусь классами билдера. Впринципе TList подходит, есть у него и функция сортировки, но вот почему-то не работает. Хотя в другом приложении вроде бы работала. Точно такая же функция. Не пойму в чем дело.
PM MAIL   Вверх
smoke_man
Дата 25.11.2009, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Посмотри пример.

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  FloatSort.rar 197,53 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
smoke_man
Дата 25.11.2009, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



И пример с использованием TList.

Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  FloatSortList.rar 195,21 Kb


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Нитонисе
Дата 25.11.2009, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(smoke_man @  25.11.2009,  22:04 Найти цитируемый пост)
И пример с использованием TList.

Эта функция работает. Однако она же практически ничем не отличается от моей. Почему моя не работает?

P.S. В твоем примере не освобождена, по-моему, память, занимаемая элементами TList? ты 4 раза выделяешь память для float, но не освобождаешь ее.
PM MAIL   Вверх
smoke_man
Дата 25.11.2009, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Разница в том, что разность X1-X2  -  float, а функция возвращает тип int. Таким образом,как пример -  0.9 - 0.6 будет равно 0 на выходе функции. Следовательно, получается, что эти два числа равны, что является неправильным.


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
Нитонисе
Дата 25.11.2009, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 917
Регистрация: 5.11.2009

Репутация: 2
Всего: 2



Цитата(smoke_man @  25.11.2009,  22:36 Найти цитируемый пост)
Разница в том, что разность X1-X2  -  float, а функция возвращает тип int. Таким образом,как пример -  0.9 - 0.6 будет равно 0 на выходе функции. Следовательно, получается, что эти два числа равны, что является неправильным.

Точно! Не додумал. Спасибо.
PM MAIL   Вверх
smoke_man
Дата 25.11.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 447
Регистрация: 25.1.2007
Где: Рязань

Репутация: 9
Всего: 17



Не за что!


--------------------
0x2b|~0x2b
PM MAIL ICQ GTalk   Вверх
mrbrooks
Дата 26.11.2009, 08:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 167
Всего: 306



Цитата(artsb @  25.11.2009,  20:16 Найти цитируемый пост)
Насколько мне известно, static_cast лучше не использовать для указателей.

На чем основано это заявление? (приведение типов  через static_cast это стандарт С++)
И почему преобразование в стиле С лучше для С++?  smile 
PM MAIL   Вверх
artsb
Дата 26.11.2009, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2280
Регистрация: 17.7.2007
Где: центр Вселенной

Репутация: 39
Всего: 64



Я же говорю: "насколько помню". Просто забыл немного. Я, вообще, кроме dynamic_cast никакие ..._cast не использую smile

Это сообщение отредактировал(а) artsb - 26.11.2009, 09:10


--------------------
Чем отличается умный человек от мудрого?
Умный - выпутается из любой ситуации.
Мудрый - просто в неё не попадёт.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0551 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.