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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ERangeError и EIntOverflow, Обработка ИС 
:(
    Опции темы
zalex
Дата 30.3.2006, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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



PM MAIL   Вверх
Yanis
Дата 30.3.2006, 23:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



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

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

Это сообщение отредактировал(а) Yanis - 30.3.2006, 23:57


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
zalex
Дата 31.3.2006, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Дельфи 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-}

PM MAIL   Вверх
Yanis
Дата 31.3.2006, 00:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(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.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
zalex
Дата 31.3.2006, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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

Это сообщение отредактировал(а) zalex - 31.3.2006, 00:51
PM MAIL   Вверх
Yanis
Дата 31.3.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нет. Это отключение оптимизации, потому что компилятор не компилит этот код, если переменная нигде не юзается.


--------------------
user posted image *щёлк*
PM MAIL WWW ICQ   Вверх
zalex
Дата 31.3.2006, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



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

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.0508 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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