Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Delphi не сравнивает числа 
:(
    Опции темы
GrizliK
Дата 9.12.2009, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



есть код
Код

    while F.Position<F.Size do
    begin
      F.ReadBuffer(color,SizeOf(Double));
      t:=trunc(color);
      if(trunc(color)>=0) and (trunc(color)<=$FFFFFF) then
        Image2.Canvas.Pixels[j,i]:=round(t);
      Inc(i);
      if i>=w then
      begin
        i:=0;
        Inc(j);
      end;
    end;


он берет из файла color. Дело в том что color может быть очень большим числом поэтому стоят ограничения
Код

  if(trunc(color)>=0) and (trunc(color)<=$FFFFFF) 


но Delphi пошел хитрее и при сравнении огромных чисел выдает ошибку переполнения.
Что делать?
PM MAIL   Вверх
amsoft
Дата 9.12.2009, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 201
Регистрация: 17.10.2009
Где: KZ, Astana

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



проблема скорее всего здесь:

Код

Image2.Canvas.Pixels[j,i]:=round(t);


ты ограничения проверяешь, когда обрезаешь дробную часть, а цвет присваиваешь путем округления, вот он и округлился на одну единицу вверх, что уже выходит за допустимые пределы.
Присваивай так:

Код

Image2.Canvas.Pixels[j,i]:=trunc(t);

--------------------
"Кто бы ты ни был - не думай о себе слишком"Дельфин
PM   Вверх
sCreator
Дата 9.12.2009, 20:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Может переполнение происходит при выполнении trunc(color) ?
High(Double) = 1.7 x 10^308    
High(Int64) = 2^63-1

добавьте проверку color < High(Integer) перед первым выполнением trunc(color) 

Кстати какого типа переменная t ?

t:=trunc(color); - преобразование числа с плавающей точкой в Int64
round(t);           - округление числа с плавающей точкой в Int64

Это сообщение отредактировал(а) sCreator - 9.12.2009, 20:10
PM   Вверх
Beltar
Дата 9.12.2009, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Хранить цвет в 32-хбитном виде. Или, если так охота страдать с вещественными, то просто уменьшай все до High(Cardinal).


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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