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

Поиск:

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


Шустрый
*


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

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



Тривиальный код

Код

var b:byte;
begin
b:=255;
inc(b);
.....
ShowMessage(IntToStr(b));
end;

Понятно, что возникает переполнение (вот боюсь ошибиться в терминах)
И нигде ничего об этом не оповещает...
Вопросы
1. Как отследить оприсанную ситуацию?
2. Есть ли подобные ситуации,имеется ввиду приводящие к неправильному
результату, но молчаливо.

Это сообщение отредактировал(а) Girder - 2.11.2005, 10:53
PM MAIL   Вверх
MFSham
Дата 1.11.2005, 01:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(zalex @ 31.10.2005, 23:54)
1. Как отследить оприсанную ситуацию?

Да вроде только самому. Именно поэтому вначале решения какой-либо задачи необходимо
продумать все максимальные значения каждой переменной, и только потом заносить
ее в раздел объявления.
А в приведенном коде никакого переполнения не возникнет, а просто в b присвоится 0, т.к.
если к максимальной границе в ходе выполнения программы прибавить некое число, то
счетчик перемещается на нижнюю границу диапазона типа.
Компилятору ведь пофиг что у тебя там будет. Главное, что ты написал все правильно с его
точки зрения. А на приведенный частный случай у него имеется решения.
Следовательно на первый вопрос, ИМХО, никак.
Цитата(zalex @ 31.10.2005, 23:54)
2. Есть ли подобные ситуации,имеется ввиду приводящие к неправильному результату, но молчаливо.

По моему вопрос поставлен не особо некорректно. Что значит приводят к неправильному результату? Если ты неправильно совмещаешь типы данных, то ты соответственно получишь и неверный результат. Как написал выше, вначале все надо обмозговать, а только потом
реализовывать. Тогда и придешь к правильному результату. А если вообщем, то с такими
ситуациями я не сталкивался.

--------------------
Без ветра трава неподвижна. Без программ компьютеры бесполезны.
PM MAIL   Вверх
MBo
Дата 1.11.2005, 05:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



В вышеприведенном коде все вычисляется на этапе компиляции, поэтому в Runtime все проходит гладко.

А в таком коде при установленной опции компилятора Overflow checking ({$Q+} ) будет ругань:

Код
procedure TForm1.Button4Click(Sender: TObject);
var b,bb:byte;
begin
b:=1;
for bb:=1 to 255 do
  inc(b);
ShowMessage(IntToStr(b));
end;


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


Шустрый
*


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

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



ОК, действительно вставило. Такой вопрос - никомц не казалось, что директивы эти отрабатываются как то заторможенно. Т.е. не сразу что ли. Вот поставил директиву (Д7) - и никакого результата. А потом через нектр время - сработало.
PM MAIL   Вверх
MBo
Дата 2.11.2005, 08:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



>Вот поставил директиву (Д7) - и никакого результата
Может, не перебилдил сначала?
PM MAIL   Вверх
Sardar
Дата 2.11.2005, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

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



В статусном регистре проца всегда существует флаг, показывающий было ли переполнение после последней арифметической операции. Вывод: попробовать зачитать на асме smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
zalex
Дата 2.11.2005, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ОК, и с директивами разобрался, а Асм он вообще рулит. Спасибо.
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.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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