Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > ERangeError и EIntOverflow


Автор: zalex 30.3.2006, 23:23
Привет всем.
Попытался понять, в чем разница между директивами ($R+) и ($Q+). Кажется понял, и прошу проконтролировать - правильно ли?
Итак
ERangeError возникает в случае, если идёт обращение к "неправильному" индексу массива, строки. Так же к ERangeError приводит строка, в которой есть оператор _присвоения_, при попытке присвоения целочисленной величине значения, выходящего за допустисый дивавзон.

EIntOverflow возникает в случае, если в строке нет оператора присвоения, но полученный результат не помещается в указанном диапазоне, например Inc ©, Dec (d) - где c=255,d=0, c,d:Byte.



Автор: Yanis 30.3.2006, 23:56
Цитата(zalex @ 30.3.2006, 23:23 Найти цитируемый пост)
EIntOverflow возникает в случае, если в строке нет оператора присвоения, но полученный результат не помещается в указанном диапазоне, например Inc ©, Dec (d) - где c=255,d=0, c,d:Byte.

Нет. Только в случае с типом Integer. А в твоём примере как раз генерируется ERangeError.

Автор: zalex 31.3.2006, 00:24
Дельфи 7. Выдает именно EIntOverflow.

Код

{$R+}
{$Q+}
procedure TForm1.Button5Click(Sender: TObject);
var
a,b,c:Byte;

begin

try
a:=255;

Inc(a);
ShowMessage(IntToStr(a));
except
 on ERangeError do ShowMessage('Âûõîä çà äèàïàçîí.');
 on EIntOverflow do ShowMessage('Ïåðåïîëíåíèå.');
 on EDivByZero do ShowMessage('Äåëåíèå íà íîëü.');
 else ShowMessage('ÈÑ');
 end;

end;
{$R-}
{$Q-}

Автор: Yanis 31.3.2006, 00:43
Цитата(zalex @ 31.3.2006, 00:24 Найти цитируемый пост)
Дельфи 7. Выдает именно EIntOverflow.
Помоему это из за приведения типа параметра, который передаётся в Inc.

Попробуй такой код:
Код

var
  a,b,c:Byte;
begin
  {$O-}
  a:=255;
  a := a+1;
end;

Генерируется именно ERangeError, т.е. вызывается процедура _BoundErr, а если бы генерировался EIntOverflow, то срабатывала бы процедура _IntOver.

Автор: zalex 31.3.2006, 00:48
дык я же отметил ,что в случае наличия оператора присавивания - ERangeError, а при его отсутствии EintOverflow
приведенный Вами код выдаст ERangeError

ЗЫ В Вашем примере директивка {$O-} - опечатка?

Автор: Yanis 31.3.2006, 00:53
Нет. Это отключение оптимизации, потому что компилятор не компилит этот код, если переменная нигде не юзается.

Автор: zalex 31.3.2006, 00:55
понял, поэтому, что бы просмореть Ваш пример, внизу добавил
ShowMessage(IntToStr(a))

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)