Run-Time Error - как это работает?

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

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

Run-Time Error - как это работает?

Сообщение jsa » 25.03.2020 15:27:32

Программа выполняется без видимых ошибок и сообщений о них, если компилирована в режиме release
Если в режиме debug то вылетает с ошибкой переполнения
тип ошибки
215 Arithmetic overflow error
This error is reported when the result of an arithmetic operation is outside of its supported range. Contrary to Turbo Pascal, this error is only reported for 32-bit or 64-bit arithmetic overflows.
This is due to the fact that everything is converted to 32-bit or 64-bit before doing the actual arithmetic operation.

С этим разобрался. В определенный момент результат арифметической операции не умещается в размерность типа.

Не понятно вот что
1. Почему в режиме "релиз" нет ошибки, Это где-то включается/выключается?
2. Т.е. ошибки нет, но искажаются результаты расчетов, получается, что всё, что не умещается в отведенное типу кол-во байт просто усекается, и что поместилось скажем в 4 байта для целого, то и поместилось, а биты с лева уходят в небытие. Так?
jsa
постоялец
 
Сообщения: 147
Зарегистрирован: 28.11.2017 13:46:04

Re: Run-Time Error - как это работает?

Сообщение Vadim » 26.03.2020 03:39:27

jsa писал(а):1. Почему в режиме "релиз" нет ошибки, Это где-то включается/выключается?

В fpc.cfg это дело по умолчанию закомментировано, а вот при объявлении "DEBUG" оно стоит.
jsa писал(а):всё, что не умещается в отведенное типу кол-во байт просто усекается, и что поместилось скажем в 4 байта для целого, то и поместилось, а биты с лева уходят в небытие. Так?

Примерно. Допустим для типа BYTE процедурами Inc() Вы подошли к числу 255 (двоичное 1111 1111). Следующий Inc() будет не 256 (двоичное 1 0000 0000), а 0 (двоичное 0000 0000), потому что коробочка переменной ограничена объёмом и числа в ней только те, что влезают в 8 бит, остального просто не существует. Все вычисления идут исключительно в рамках объёма этой коробочки. Всё что за рамками просто не существует.
Vadim
долгожитель
 
Сообщения: 3894
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Run-Time Error - как это работает?

Сообщение jsa » 26.03.2020 13:29:58

Спасибо, большое.
Разобрался, Параметры компилятора - Отладка - проверки и Assert
jsa
постоялец
 
Сообщения: 147
Зарегистрирован: 28.11.2017 13:46:04

Re: Run-Time Error - как это работает?

Сообщение runewalsh » 26.03.2020 23:30:49

Это можно локально включить/отключить, если какой-то кусок кода осознанно использует переполнения:
Код: Выделить всё
{$push} {$overflowchecks off}
procedure IncWrap(var x: integer);
begin
    x += 1; // врапнется вместо бросания overflow безотносительно настроек проекта
end;
{$pop}
Аватара пользователя
runewalsh
постоялец
 
Сообщения: 456
Зарегистрирован: 27.04.2010 00:15:25

Re: Run-Time Error - как это работает?

Сообщение jsa » 27.03.2020 08:24:41

Спасибо!!!
jsa
постоялец
 
Сообщения: 147
Зарегистрирован: 28.11.2017 13:46:04


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot], MailRu[bot] и гости: 7

Рейтинг@Mail.ru