forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Правильная загрузка (http://forum.boolean.name/showthread.php?t=14834)

Trazzy 04.06.2011 07:53

Правильная загрузка
 
Помогите разобраться с загрузкой. Из-за округления определенный процент теряется.
Пробовал real, но у него свои "причуды":(

PHP код:

program gauge_sample;

var 
gauge_wgauge_hinteger;

procedure draw_gauge(progressinteger);
begin
  setcolor
(160,160,160);
  
drawrect(55gauge_w+3gauge_h+3);
  
setcolor(90,90,90);
  
fillrect(77progress*(gauge_w/100), gauge_h);
end;

begin
  
//задаем размеры:
  
gauge_w:=getWidth-14;
  
gauge_h:=10;
  
//рисуем прогрессбар
  
draw_gauge(100);
  
repaint;
  
repeat until GetKeyClicked=KE_STAR;
end


Trazzy 04.06.2011 08:28

Ответ: Правильная загрузка
 
Проблема решена! Нашел в другом разделе (был не внимателен). Тема закрыта!:)
Нужно было просто перевести int в real.
(код ↓)
PHP код:

program gauge_sample;

var 
gauge_wgauge_hinteger;

procedure draw_gauge(progressreal);
var 
p1p2p3real// <<=1=
begin
  setcolor
(160,160,160);
  
drawrect(55gauge_w+3gauge_h+3);
  
setcolor(90,90,90);
  
p1:=progressp2:=gauge_wp3:=100.0// <<=2=
  
fillrect(77trunc(p1*(p2/p3)), gauge_h); // <<=3=
end;

begin
  gauge_w
:=getWidth-14;
  
gauge_h:=10;
  
draw_gauge(50);
  
repaint;
  
repeat until GetKeyClicked=KE_STAR;
end


YellowAfterlife 04.06.2011 21:22

Ответ: Правильная загрузка
 
Можно заставить исходный код работать корректно, если поменять скобки местами в fillRect:
Код:

fillrect(7, 7, (progress * gauge_w) / 100, gauge_h);
Допустим что ширина экрана = 240
Тогда gauge_w = 226
В вашем изначальном коде формула задана как progress * (gauge_w / 100).

При выполнении с progress = 100 выполняются следующие операции:
n = gauge_w = 226
n = n / 100 = 2 (переменная целочисленная - дробная часть отброшена)
n = n * progress = 200
ширина = 200 (должно было быть 226)

Если поменять порядок скобок на упомянутый мной, то действия будут изменены на:
n = progress = 100
n = n * gauge_w = 22 600 (к счастью, максимальное значение целочисленной 2 147 483 648)
n = n / 100 = 226 (успех!)

В случае, когда производится большое количество прорисовок экрана, использование целочисленных может оказатся выгоднее чем использование несомненно хорошего, но медлительного класса Real из MP.
Надеюсь эта информация оказалась полезной.
Хорошего дня.


Часовой пояс GMT +4, время: 09:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot