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

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

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

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

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

Сообщение Владимир »

Господа-граждане, всем доброго!
После перехода на дистриб 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, с другой - раньше такой фокус проходил...
Какие мнения?
Vadim
долгожитель
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Сообщение Vadim »

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

Однозначно - использовать целочисленное деление (div), а не заставлять процессор маяться дурью со всякими там Round'ами. ;)
Владимир
постоялец
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Сообщение Владимир »

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

Спапсибо, как-то раньше не задумывался.
Аватара пользователя
informat
новенький
Сообщения: 62
Зарегистрирован: 27.10.2010 09:44:20
Откуда: http://informat.name
Контактная информация:

Сообщение informat »

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

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


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

Хотя в данном случае это может быть и несущественно.
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Владимир,
можешь изобразить простейшую консольную программу, на которой воспроизводится эффект (т.е. round от положительного выражения выдает "9 знаков с минусом")?
(пример выше не годится, потому что его нельзя откомпилировать)
Аватара пользователя
Максим
энтузиаст
Сообщения: 599
Зарегистрирован: 27.07.2007 01:51:43
Откуда: Москва

Сообщение Максим »

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

Сообщение Владимир »

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


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