Чудеса ф-ции round()

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Чудеса ф-ции round()

Сообщение Владимир » 18.11.2011 09:39:30

Господа-граждане, всем доброго!
После перехода на дистриб VectorLinux в приложении перестал корректно работать ProgressBar - вешал систему напрочь. После длительной разборки выяснил, что (пример условный):
Код: Выделить всё
i:Integer;
.....
ProgressBar.Position:=0;
ProgressBar.Max:=200;
for i:=0 to 1000 do
ProgressBar.Position:=Round(i/5);

...и система встает (загрузка ЦП 100%). Сами значения Round(i/5) - 9 знаков с минусом.
Стоило поменять тип i на Double - все заработало нормально. С одной стороны, надо вызывать Round корректно, с аргументом float, с другой - раньше такой фокус проходил...
Какие мнения?
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Чудеса ф-ции round()

Сообщение Vadim » 18.11.2011 09:59:29

Владимир писал(а):Какие мнения?

Однозначно - использовать целочисленное деление (div), а не заставлять процессор маяться дурью со всякими там Round'ами. ;)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Чудеса ф-ции round()

Сообщение Владимир » 18.11.2011 11:41:13

Vadim писал(а):Однозначно - использовать целочисленное деление (div), а не заставлять процессор маяться дурью со всякими там Round'ами.

Спапсибо, как-то раньше не задумывался.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Чудеса ф-ции round()

Сообщение informat » 21.11.2011 06:12:04

Vadim писал(а):
Владимир писал(а):Какие мнения?

Однозначно - использовать целочисленное деление (div), а не заставлять процессор маяться дурью со всякими там Round'ами. ;)


round и div дают разные результаты.
round (2/3)= 1
2 div 3 = 0

Хотя в данном случае это может быть и несущественно.
Аватара пользователя
informat
новенький
 
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name

Re: Чудеса ф-ции round()

Сообщение Sergei I. Gorelkin » 21.11.2011 08:26:03

Владимир,
можешь изобразить простейшую консольную программу, на которой воспроизводится эффект (т.е. round от положительного выражения выдает "9 знаков с минусом")?
(пример выше не годится, потому что его нельзя откомпилировать)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
 
Сообщения: 1407
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Re: Чудеса ф-ции round()

Сообщение Максим » 22.11.2011 01:41:13

Только сначала не мешало бы взять последнюю стабильную версию FPC, а то в подписи Владимира я наблюдаю версию 2.4.0.
Аватара пользователя
Максим
энтузиаст
 
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Re: Чудеса ф-ции round()

Сообщение Владимир » 27.11.2011 13:14:14

Sergei I. Gorelkin писал(а):Владимир,
можешь изобразить простейшую консольную программу, на которой воспроизводится эффект (т.е. round от положительного выражения выдает "9 знаков с минусом")?
(пример выше не годится, потому что его нельзя откомпилировать)


Наверное, я не точно выразился - не round() дает 9 знаков с минусом, а значение ProgressBar.Position.
Тестовый пример с ProgressBar работает как часы. Подозреваю, проблема в том, что проект начинался еще на Kylih, затем портирован в Lazarus и те ProgressBar-ы, которые стали глючить, также перекочевали из Kylih. Помню, что на каком-то этапе при смене версий Lazarus выход ProgressBar.Position за пределы ProgressBar.Max валил приложение.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 228

Рейтинг@Mail.ru